ローカライズで Localizable.stringsを使った時、実行時に文字列を置換したい場合がある。例えばあるファイルが削除された場合に「xxxx が削除されました」としたい。この場合、文字列に %@ を含めておいて、NSString#stringWithFormat: で置換する。
Japanese/Localizable.strings
"%@ is deleted" = "%@ が削除されました"
tmp = NSLocalizedString(@"%@ is deleted", @"");
msg = [NSString stringWithFormat:tmp, @"mike.jpg"];
(結果)msg: "mike.jpg が削除されました"
では置換文字列が複数あり、言語によって出現順番が異なる場合はどうするか?
その場合は #stringWithFormat: の書式指定で %n$@ を使う。n には引数の順番が入る。
Japanese/Localizable.strings
"%@ is deleted by %@" = "%2$@ によって %1$@ が削除されました";
tmp = NSLocalizedString(@"%@ is deleted by %@", @"");
msg = [NSString stringWithFormat:tmp, @"mike.jpg", @"Happycatsan"];
(結果)msg: "Happycatsan によって mike.jpg が削除されました"
英語の場合
English/Localizable.strings
"%@ is deleted by %@" = "%1$@ is deleted by %2$@";
tmp = NSLocalizedString(@"%@ is deleted", @"");
msg = [NSString stringWithFormat:tmp, @"mike.jpg", @"Happycatsan"];
(結果)msg: "mike.jpg is deleted by Happycatsan"
なお Localizable.strings のキー文字列には %@ を含める必要は無い。先ほどの場合も
"deleted" = "%1$@ is deleted by %2$@";
と定義できる。
ただ対応するキーが存在しない場合や、プログラミング上の便宜性を考慮すると通常は英語表記と同じにするのが良いようだ。
なお n$ 表記は %@ だけでなく整数の %d や 浮動小数点の %f にも適用可能(例)%1$d, %2$f
参考情報
Resource Programming Guide > Advanced Strings File Tips: Formatting String Resources