Base国際化使用への移行: 古いmacOSアプリ移植ノウハウ

macOS 10.5時代に開発した古いmacOSアプリを現代のOSに移植する作業を行っています。その中で、ビルドを通した物のデバッガにすら読み込まれず、起動できないという問題に遭遇しました。

今回の原因はローカライズリソースフォルダでした。

目次

原因の調査

デバッガにも読み込まれないという状態なので、ビルドされたアプリケーションパッケージの構造に問題があると考えられましたので、ターミナルからの起動を試みます。Xcodeでビルドしたアプリの中間オブジェクトはデバッグ用のバイナリなどは、デフォルト設定では、以下のディレクトリにプロジェクトごとのフォルダが作られ出力されます。

~/Library/Developer/Xcode/DerivedData

今回のアプリは「RKDetailDesign」といいうアプリです。プロジェクトファイル名が RKDetailDesign.xcodeproj なので、上記のディレクトリに RKDetailDesign-byccbbcuvpnixtdhipwqzxlntobvというフォルダが見つかります。その中の以下のディレクトリにデバッグ版のアプリが入っています。

Build/Products/Debug

ターミナルからビルドしたデバッグ版のアプリを起動します。

% cd /Users/akira/Library/Developer/Xcode/DerivedData/RKDetailDesign-byccbbcuvpnixtdhipwqzxlntobv/Build/Products/Debug
% % ./RKDetailDesign.app/Contents/MacOS/RKDetailDesign
2024-03-15 22:10:17.965 RKDetailDesign[14090:143830] Unable to load nib file: MainMenu, exiting

原因が判明しました。 MainMenu.nib をシステムが見つけることができず、起動処理が中断されていました。

MainMenu.nibファイルについて

MainMenu.nib はビルド時に MainMenu.xib ファイルから作られます。 MainMenu.xib はプロジェクトに登録されており、ローカライズはEnglishのみになっています。そしてビルドされたパッケージ内にも以下のパスに出力されています。

RKDetailDesign.app/Contents/Resources/en.lproj/MainMenu.nib

Base国際化

en.lprojというフォルダは英語版用のローカライズリソースフォルダです。昔はEnglish.lprojという名前でした。旧形式の名前を使用していると現行形式の名前を使用するようにワーニングが出ます。Xcodeの移行機能で素直に従うとen.lprojという現行形式に移行されるのですが、同時にbase.lprojというローカライズしないファイルを入れるローカライズリソースフォルダを持った、Base国際化を使用する設定になります。

この設定になっていると、base.lprojに入っておらず、特定言語用のフォルダにのみファイルが入っていると、ファイルが見つからないという動作になります。

今回の例では、en.lproj/MainMenu.nibはあるが、base.lproj/MainMenu.nibはないので、MainMenu.nibが見つからず、起動できないという状態になっていました。

Base国際化を使用しない、昔のシステムはEnglish.lprojbase.lprojの役割を兼任していました。

Base国際化を使用するかは、プロジェクトの設定の「Info」タブの「Use Base Internationalization」チェックボックスで設定します。

「Use Base Internationalization」チェックボックス
「Use Base Internationalization」チェックボックス

en.lprojからbase.lprojに移動する

en.lprojからbase.lprojにファイルを移動します。とりあえずは、問題になっているMainMenu.nibを移動します。Xcodeでできます。ここではMainMenu.nibを例にリソースファイルの別言語版を追加する手順を紹介します。以下の様に操作します。

STEP
MainMenu.xibを選択します。
STEP
ファイルインスペクタでローカライズにBase版を追加します。

ファイルインスペクタの「Localization」に選択しているファイルのローカライズ情報が表示されます。「English」だけが選択されています。これは英語版のみあることを示しています。「Base」を選択してBase版を追加します。これによりbase.lprojMainMenu.xibがコピーされます。

「Base」をチェックする
「Base」をチェックする
STEP
英語版を削除する

Base版をローカライズしていないバージョンとして使用します。古いシステムでは英語版がその役割でしたので、英語版は必要なくなったので「English」のチェックを外します。これにより、en.lprojからMainMenu.xibが削除され、ビルド時にen.lproj/MainMenu.nibが出力されなくなります。

「English」のチェックを外す
「English」のチェックを外す

テスト

リソースファイルの構成が変わるので、「Product」メニューから「Clean Build Folder…」を実行してからビルドします。

base.lproj/MainMenu.nibが出力されたことでMainMenu.nibが見つかり起動するようになりました。

en.lrpojにある他のファイルについても同様に操作して、base.lprojに移動すれば、Base国際化を使うように移行完了です。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次