2026-05-07 iOS String Catalog(xcstrings) ローカライズ CI ゲート と レンタル Apple Silicon クラウド Mac(HK / JP / KR / SG / US)
ストリングのドリフトは App Store 提出の静かな殺し屋です。英語のスクリーンショットは綺麗でも、手元に無い端末で QA が言語を切り替えたときに初めて 省略、複数形ルール欠落、古い バリアント が露わになります。Xcode String Catalog(.xcstrings)はそれらを集約しますが、香港・東京・ソウル・シンガポール・米国で Mac mini M4 をレンタルするチームでも CI 契約 は必要です—PR ごとのカタログ検証、翻訳者向け XLIFF 出力、衝突検知付きインポート、ビジネス上重要なロケールごとの自動 UI パスを最低 1 回。本 2026-05-07 のガイドではリリースノートに無い運用—12 以上 のロケールを足しても xcodebuild を速く保つ方法、並列レーン上限 との整合、ローカライズ資産の再生成で DerivedData が膨らまないようにする ジョブ単位の分離 をまとめます。依存解決が同じホストを共有するなら SwiftPM キャッシュ衛生 と併用し、リリース週にエクスポートとパッケージ解決が同じ NVMe キューを奪い合わないようにしてください。
ローカライズがパイプラインの最後で壊れる理由
機能テストは英語で通ります。マーケは repo に触れないコピーで承認します。翻訳ベンダーには返す頃には古い ZIP が届きます。String Catalog がプロセスを魔法のように直すわけではなく—Git で diff できる 単一アーティファクト を与えます。CI の仕事は、欠落キー・不正な複数形・不正プレースホルダをコンパイルエラー並みに騒がしくすることです。
xcstrings と散在する .strings / stringsdict
レガシー構成では翻訳が数十ファイルに分裂し、削除をレビューが見逃します。.xcstrings はメタデータ・状態・バリアントを束ね自動化しやすくしますがマージ衝突の表面積は増えます。移行中はインフラ repo にどのターゲットがまだレガシーを食うかの 互換マトリクス を残してください。二重ソースは早めに廃止—同じキーで並列フォーマットは git blame を混乱させます。
GitHub/GitLab で強制できる品質ゲート
- 構文検証 — リリースと同じ
DEVELOPER_DIRでカタログをコンパイル。 - キー網羅 — ティア 1 リストのロケールで
NEW_KEYの状態がtranslatedでないなら失敗。 - プレースホルダ整合 —
%@、%d、位置指定パラメータの不一致を拒否。 - スクリーンショット Lint — 任意だがスクリーンショットテストを使うなら英語以外を夜間に 1 ロケール。
ヘッドレス ビルダー向けインポート / エクスポート手順
SSH のみを想定し、GUI ではなく再現可能なコマンドを使います:
xcodebuild -exportLocalizations -project YourApp.xcodeproj -localizationPath ./exports
xcodebuild -importLocalizations -project YourApp.xcodeproj -localizationPath ./imports
エクスポートは IPA エクスポートと ASC アップロード と同じ NVMe ボリュームに置き、署名とローカライズ自動化で権限と umask を揃えます。常に専用 CI ユーザーで実行し、root は使わず TCC の判断を保ちます。
XLIFF 往復の衛生
翻訳者には安定した ID が必要で、エンジニアには決定的なインポートが要ります。XLIFF は Git かオブジェクトストアに チェックサム タグ 付きで保管。ベースカタログに無いキーを変えるインポートは拒否し、レビューが頼る note を剥がすファイルも拒否。複数地域がバリアントを足す場合(例 zh-Hans と zh-Hant)、CI が推測しないようビジネスルールを YAML にします。
複数形・デバイス・幅バリアント
現代アプリは watch のコンプリケーション、Dynamic Type のスクショ、Shortcuts 文字列など デバイス固有 の幅を要します。カタログはバリアントをサポートしますが QA マトリクスに載っていなければ意味がありません。どのバリアントが 必須 でどれが 努力目標 か文書化し CI 閾値に反映—さもないとエンジニアはマージを急いですべて needs_review にします。
ホストを溶かさず並列ロケール行列
ロケールを足すたびに UI フローを XCTest すると資産作業が倍増します。ホストごとの同時実行先は 並列 xcodebuild ジョブ と同じキュー規律で上限してください。シャーディング を推奨:レーン A が東アジア、B が欧州、C が RTL スモーク。シャードごとの実時間を記録し、p95 が四半期で 25% 超増なら翻訳チームに近い地理へレンタル ノードを追加。
ディスク、DerivedData、ローカライズキャッシュ
エクスポートとインポートは数千の小ファイルを触れ—APFS メタデータを忙しくさせます。フルエクスポート前にビルダー卷に少なくとも 18% の空きを確保し、過去の XLIFF をコールドストレージへ退避して DerivedData 横に溜めない。TMPDIR と xcresult の分離 に従い、ローカライズ ジョブが別パイプラインの成果物を消せないようにします。
社内公開できる数値目標
- リリース候補タグ前にティア 1 ロケール 100% 網羅。
- カタログで
staleが 14 日超未解決が 0。 - 典型的 PR の増分ローカライズ検証が 12 分未満。
ストリング凍結前の九ステップ
- プロダクト文言を凍結し、コミット SHA を添えてベンダーへ通知。
- リリースブランチからベースライン XLIFF をエクスポート。
- App Store ビルドと同じ Xcode でカタログ検証。
- ベンダーファイルを捨てブランチへインポートし JSON 状態を diff。
- LTR・RTL・CJK の 三 ロケールで UI スモーク。
- アプリ内文言と同期しているなら App Store メタデータも確認。
du -shでローカライズディレクトリをスナップショットし NVMe 退行を追跡。- マージをタグしコンプライアンス用チェックサム一覧を添付。
needs_reviewの発売後監査をスケジュール。
FAQ:App Store レビュー、CI ユーザー、ハイブリッド Pod
| 質問 | 実務的回答(2026-05-07) |
|---|---|
| CocoaPods と SPM のハイブリッド repo は追加手順が要るか | はい—依存解決の後にローカライズし生成バンドルが揃ってから。順序は SwiftPM と CocoaPods を参照。 |
| タイポ修正だけなら UI テストを省略できるか | ポリシー bot が空白のみと証明できる場合のみ—さもなくば英語以外スモークを最低 1 回。 |
ローカライズ負荷が高い CI に Mac mini M4・1–2 TB が合う理由
ローカライズ パイプラインは メタデータランダム:無数の小ファイルが、すでに xcodebuild test を載せているのと同じ NVMe コントローラを叩きます。MacXCode のベアメタル Mac mini M4 ノードは遅延を一定に保ち、ゲートが翻訳スループットを測り—隣のテナント騒音ではありません。キャパシティ計画が別ビルダーを要するときは HK / JP / KR / SG / US の 地域別料金 を引用し、ベンダーの SSH をリリースエンジニアと並べる手順は ヘルプ に。