質問: 現在、iOSアプリにて多言語対応をしているのですが、 文字列のリストアップが面倒です。 そこで思い出したんですが、確かObjective-C時代に、 プログラム内の文字列("Hello"など)をリストアップしてくれる ツールがあった気がするのですが、 そのようなツールは、今でもありますでしょうか。
回答: 直接の回答にならないかも知れませんが、ソースコードはアルゴリズムやロジックを記述するファイルなので、メッセージデーターを(文字列)リテラルとしてソースに直接記述するのはお勧め出来ません。 `macOS`/`iOS`には `Objective-C`の場合は ``` NSLocalizedStringFromTable(key, tbl, comment) // 上の簡易版として(tblの値はnil)と書く事も出来る NSLocalizedStringFromTable(key, comment) // 実際に呼ばれるのは、NSBundleクラスの - (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName; ``` `Swift`の場合は ``` NSLocalizedString(_ key: String, tableName: String? = nil, bundle: Bundle = Bundle.main, value: String = "", comment: String) -> String ``` というマクロとメソッドが用意されています。 このメソッドを利用するには、多言語化で追加された`.lproj`フォルダーに、一つだけなら`Localizable.strings`というファイルを各`.lproj`フォルダー下に追加し、用途(例えば`View`毎に管理したい等)によってこの`.strings`ファイルを分割したいのであれば、同様に各`.lproj`フォルダー下に`テーブル名.strings`というファイルを配置します。 `.strings`ファイルの内容は ``` "キー文字列1" = "その国の言語でのメッセージ1"; "キー文字列2" = "その国の言語でのメッセージ2"; // コメントも記述可能 "キー文字列3" = "その国の言語でのメッセージ"3; ``` と記述します。 これで`tbl`, `tableName`が`nil`の場合は`Localizable.strings`というファイルを、`tbl`, `tableName`が文字列の場合は、`テーブル名.strings`というファイルを参照し、`key`に対応する現在の言語の`.lproj`ファイルから、一致するキー = メッセージのメッセージ部を返してくれるようになります。 これを`Objective-C`なら`NSString *`型の変数に、`Swift`なら`String`型の変数に代入し、メッセージとして表示する(`UILabel`なら`text`プロパティにセット、`UIButton`なら`titleLabel`や`- (void)setTitle:(NSString *)title forState:(UIControlState)state`でセットすることでラベルやボタンの多言語化が可能です。 この方法の一番のメリットは、ソースコードを編集することなく言語追加に対応出来る。 対応言語を増やす際も、 * `Xcode`で、`Localization`を追加 * 各`.strings`ファイルを他の`.lproj`フォルダーから全てコピー * キーの値を変えずに、メッセージのみその国の言語に書き替え * 翻訳を終えた`.strings`ファイルをプロジェクトに追加 することで済んでしまうので、翻訳にだけ意識を集中出来ることです もちろん、メッセージの中には`%@`, `%d`, `%n.mf`を含めることが出来るので、受けとった文字列を`stringWithFormat`や`String(format:...)`の第一引数にすることで、メッセージに文字列付加や、数値付加も出来ます なので、後々対応する言語が増える場合、多言語化すべき文字列が多い場合は`.strings`ファイルと`(NS)LocalizedString`を使った多言語化をした方が良いと思います。 また、今回はソース内の文字列とのことでしたので、`.strings`ファイルを使った多言語化について説明しましたが、`.storyboard`や, `.xib`ファイル内のメッセージだけ多言語化するのであれば、`xliff`ファイルを使った多言語化という方法もあります。 最後に、`(NS)LocalizedString`までたどり着いていて、置き換えるべき文字列リテラルを探す方法だけを求めていたのでしたら、役に立たない回答で申し訳ありません。