Я знаю, что некоторые люди не любят # define's, но они хорошо работают для этого программиста старой школы C.
В каждом проекте у меня есть файл "Strings.h", который содержит несколько # define, например:
#define SK_String_I_Want_To_Display @"String I Want To Display"
(где SK_ - мое предисловие для обозначения «строковой константы».)
Для локализации у меня есть еще один файл с именем "LocalStrings.h" со строками вроде:
#define SK_LOCAL(a) NSLocalizedString(@a, "") // keeps string defs simple
#define SK_Localized_String SK_LOCAL("Localized String")
#define SK_Another_String SK_LOCAL("Another String")
Тогда я просто #import "Strings.h" или "LocalStrings.h", где это необходимо. Поскольку у меня есть все локализованные строки в одном файле, легко убедиться, что я локализовал все.
Самая большая проблема с этим подходом заключается в том, что вы должны быть осторожны, чтобы не делать что-то вроде этого:
#define SK_Another_String SK_LOCAL("Another String");
--- так как эта точка с запятой в конце может вызвать хитрые ошибки, которые трудно найти.
Затраты на расширение #define на месте довольно низкие. Компиляция займет немного больше времени, если вы измените один из этих файлов .h, но я считаю, что решение хорошо работает.