〖Apple標準機能を日本語で使う、Package.swiftの1行〗 iPad Swift Playgroundで「見る」をつくる
週刊プレイグラウンズ第42号
視覚サポートテクノロジー試行シリーズ
はじめに
前号では、ARKitを使って、画面をタップした場所までの距離を測る仕組みを説明しました。
そして最後に、
「次号では、壁までの距離を扱います」
と予告しました。
ここで予定を変更します。
壁までの距離を試す準備をしながら、ARKitをVoiceOverで操作していたところ、以前から気になっていたことが、思いがけず別の過去の試行にもつながりました。きっかけは、前号でも紹介した
コーチングオーバーレイ(ARCoachingOverlayView)
です。
AppleがARKitに標準で用意しているこの機能は、ARを開始したとき、
「デバイスを動かしてください」
「もっとゆっくり動かしてください」
といった案内を表示し、ユーザーがARKitで空間を認識することをサポートします。Appleも、ARCoachingOverlayViewを、ARKitのトラッキングを成立させるための標準的な案内を表示するViewとして説明しています。
しかも、この案内はVoiceOverにも対応しています。
ところが、iPad Swift Playgroundで作ったアプリでは、一つ問題がありました。
日本語のiPadなのに英語で読まれる
iPadの使用言語は日本語。
iPad Swift Playgroundの「優先する言語」も日本語。
それでも、ARCoachingOverlayViewを表示すると、案内が英語になり、VoiceOverでも英語として読み上げられました。
ARKitのコードに英語を書いているわけではありません。

例えば前号で使ったコードは、このようなものです。
let coaching = ARCoachingOverlayView()
coaching.session = arView.session
coaching.goal = .horizontalPlane
coaching.activatesAutomatically = true
coaching.autoresizingMask = [.flexibleWidth, .flexibleHeight]
coaching.frame = arView.bounds
arView.addSubview(coaching)
goal = .horizontalPlane は、「水平な面を見つけること」を目標として指定しているだけです。
表示する文章を書いているのは私たちではありません。
Appleが用意したものです。
ARCoachingOverlayViewは、必要な平面が見つかるまでユーザーにデバイスを動かすよう案内し、条件が整えば案内を自動的に終了します。つまり、せっかくAppleが標準で用意してくれた案内がVoiceOver対応なのに、iPad Swift Playgroundから使うと英語になってしまっているのです。
Package.swiftに1行追加してみる
iPad Swift Playgroundで作成するテンプレートのAppプロジェクトは、内部的にはSwift Packageとして構成されています。
Swift Packageには、パッケージの設定を記述するPackage.swiftというファイルがあります。Appleのドキュメントでも、Package.swiftはPackage Manifestと呼ばれ、依存関係やローカライズされたリソースなどの設定を記述するファイルとされています。
iPad Swift Playgroundが生成するPackage.swiftには、通常、このような部分があります。
let package = Package(
name: "マイアプリ",
platforms: [
.iOS("26.0")
],
ここに、1行追加しました。
let package = Package(
name: "マイアプリ",
defaultLocalization: "ja",
platforms: [
.iOS("26.0")
],
追加したのは、これだけです。
defaultLocalization: "ja",
defaultLocalizationはSwift Package Managerに正式に用意されている設定です。Appleのドキュメントでも、パッケージのリソースをローカライズするときは、Package initializerのdefaultLocalizationに既定の言語を指定する方法が説明されています。
jaは日本語を表します。
ARKitが日本語で話し始めた
この状態で、もう一度ARKitのアプリを実行しました。
ARCoachingOverlayViewの案内が日本語になりました。
そしてVoiceOverをオンにすると、日本語で読み上げます。

ARKit側のコードは一切変更していません。
独自のVoiceOver用コードも追加していません。
英語の文章を日本語へ翻訳するコードもありません。
変えたのは、
defaultLocalization: "ja",
の1行です。
ここで、この1行の意味を少し違う角度から考えることになりました。これは単に「表示を日本語にする設定」なのでしょうか。
RoomPlan(iPad Pro)でも試してみる
以前、このシリーズとは別の試行で、AppleのRoomPlanを使ったことがあります。RoomPlanは、LiDARなどを利用して部屋をスキャンし、壁やドアなどの構造だけでなく、部屋にある物体も認識できるフレームワークです。
RoomPlanには、bed、chair、refrigerator、sofa、table、televisionなど、室内にあるさまざまな物体のカテゴリが定義されています。
この仕組みを視覚サポートに利用すれば、
「正面にソファがあります」
「テーブルがあります」
といった情報をVoiceOverで伝えることができます。以前試したときには、英語で扱われる名称を日本語にするため、こちらで辞書を用意していました。
例えば考え方としては、
bed → ベッド
chair → 椅子
sofa → ソファ
table → テーブル
のような対応です。
ところが、今回defaultLocalization: "ja"を設定した状態で、RoomPlanの標準機能をVoiceOverで確認してみました。
日本語で読み上げました。
ARCoachingOverlayViewだけではなかったのです。
Appleがすでに作ってくれていたものを使う
ここで今回の試行の意味が変わってきました。これまでは、
「英語だから日本語に翻訳する」
「VoiceOverで読ませるための文字列を自分で用意する」
と考えていました。
しかし、Apple標準フレームワークには、最初からローカライズやアクセシビリティの仕組みが用意されているものがあります。それなら、私たちが同じ仕組みをもう一度作る前に、
Appleがすでに用意しているものを、正しく利用できる状態にする。
こちらを先に考えた方がよさそうです。
ARKitのコーチングオーバーレイなら、
ARKit
↓
Apple標準の案内
↓
Apple標準の日本語
↓
Apple標準のVoiceOver対応
という流れをそのまま利用できます。
自分で、
英語の状態を判定
↓
日本語の文章を用意
↓
VoiceOver用の読み上げを実装
と作り直す必要がありません。
支援のためのアプリをできるだけ小さなコードで作る、というこの取り組みでは、これはとても重要です。
APIそのものが日本語になるわけではない
ここは区別しておく必要があります。例えばRoomPlanのコードでは、物体カテゴリとして、
.bed
.chair
.sofa
.table
などを扱います。これらSwift APIの識別子が、
.ベッド
.椅子
になるわけではありません。
AppleのAPIとして定義されているカテゴリは、そのままです。
また、自分で取得したカテゴリを独自UIに表示する場合には、必要に応じてアプリ側でローカライズする必要があります。今回確認しているのは、Appleの標準機能が提供する表示やアクセシビリティ表現を利用したときの挙動です。ここを混同しないようにします。
ほかの標準フレームワークでも?
今回、実機で確認できたのは、少なくとも次の二つです。
ARKitのARCoachingOverlayView
RoomPlanを使った標準機能
では、VisionKitなど、ほかのApple標準フレームワークではどうでしょうか。
同じような効果がある可能性はあります。しかし、ここはまだ確認していません。
「defaultLocalization: "ja"を付ければ、AppleのすべてのAPIが日本語になる」
という話ではありません。今後、実際に試しながら確認します。
このシリーズでは、できることと、まだ分からないことを分けて扱います。
問題は、Package.swiftがiPadでは見えないこと
ここまでなら、
「Package.swiftに1行書けばいい」
で終わりそうです。
ところがiPad Swift Playgroundでは、通常の編集画面からPackage.swiftを見ることができません。Macへプロジェクトを移してFinderから見ると存在を確認できますが、iPad Swift Playgroundの画面上から直接編集するための通常のUIはありません。

さらに生成されたPackage.swift自身には、
This file is automatically generated.
Do not edit it by hand because the contents will be replaced.
という警告があります。

つまり、defaultLocalizationという設定自体はSwift Package Managerの正式な機能ですが、iPad Swift Playgroundが自動生成するPackage.swiftを直接変更する方法は、iPad Swift Playgroundが通常提供している編集方法ではありません。
その点は理解したうえで利用する必要があります。
そこで、iPadだけで設定する小さなツールを作りました
今回、iPad Swift Playgroundだけで、この設定を追加するための小さなAppプロジェクトを用意しました。
※この記事の最後にダウンロードを用意しました。

使い方は単純です。
ツールをiPad Swift Playgroundで実行する
変更したい.swiftpmのAppプロジェクトを選ぶ
現在の設定を確認する
「日本語を既定言語に設定」を実行する


ツールはPackage.swiftを調べ、
defaultLocalization: "ja",
がなければ追加します。すでに日本語が設定されていれば変更しません。
別の言語が設定されている場合には、確認してから変更します。
また、Package.swiftの構造を安全に判断できなければ、何も変更せず停止するようにしています。
利用について
このツールは、iPad Swift Playgroundが自動生成するPackage.swiftを直接変更します。
iPad Swift PlaygroundやSwift Packageの仕様変更によって、将来動作しなくなる可能性があります。
また、iPad Swift Playground側でプロジェクト設定が再生成された場合、変更内容が上書きされる可能性もあります。
利用は自己責任でお願いします。
変更する前に対象のプロジェクトを閉じておき、変更後はiPad Swift Playgroundで開き直してください。
アドバイス
プロジェクトを複製してからツールで処理すると安心でしょう。
また、このツールの利用で起動しなくなった場合も、他のコードは変更していませんので、新たにプロジェクトを作成し、コードをコピーすると元の状態と同一のコードになります。
たった1行ですが、目的はその先です
今回追加したコードは、
defaultLocalization: "ja",
たった1行です。
しかし、このシリーズで重要なのは、この1行そのものではありません。私たちが支援機能を作ろうとすると、つい、
「どう実装するか」を最初に考えてしまいます。
でもAppleのプラットフォームには、すでに多くの認識技術、UI、ローカリゼーション、アクセシビリティ機能があります。それならまず、
標準機能だけで、どこまでできるのか。
そして、
Appleが用意しているアクセシビリティを、できるだけそのまま使えないか。
を調べる。不足しているところだけ、自分たちで追加する。
生成AIとiPad Swift Playgroundを使って、小さな支援アプリを作ろうとしているこの取り組みでは、その順番がとても大切だと思っています。今回、ARKitのコーチングオーバーレイをVoiceOverで試したことで、以前のRoomPlanの試行とつながりました。
一つの小さな設定が、過去に自分で作っていた処理を不要にする可能性がある。こういう発見も、実際に動かして試す面白さです。
次号
環境が整いました。
次号では、予定していた**「壁までの距離」**に戻ります。前号では水平な床へレイキャストしました。
次は垂直な壁です。
正面にある壁まで、あと何メートルなのか。ARKitが認識している空間を、今度は視覚サポートのための「距離」として利用してみます。
このシリーズのコード・記事・関連ファイルは、すべて無料で公開しています。今回は、既存のiPad Swift Playground Appプロジェクトへ、
defaultLocalization: "ja",
を追加するためのAppプロジェクトもダウンロードできるようにします。Apple標準の機能をできるだけそのまま使うための、最初の環境整備として試してみてください。
二つの専用アプリのダウンロード
VoiceOver対応版と未対応版を用意しました。
二つの専用アプリの機能は全く同じです。
違いは、アプリをVoiceOverで使用した時にVoiceOverが読み上げる内容だです。
どちらも、iPad Swift Playground.swftpmで、そのままアプリとして動作するものを圧縮したzipファイルでダウンロードできます。
まずボイスオーバー対応版です。
VO日本語ローカライズ設定.zip
次は、ボイスオーバー未対応版です
日本語ローカライズ設定.zip
おわりに
このシリーズのコード・記事・関連ファイルは、すべて無料で公開しています。もし「役に立った」「続きが読みたい」と思っていただけたら、記事末尾のチップ機能で応援していただけると、次号を書く力になります。どうぞよろしくお願いします。
