Я (как и все остальные) использую NSLocalizedString
для локализации своего приложения.
К сожалению, есть несколько "недостатков" (не обязательно по вине самого NSLocalizedString), в том числе
- Нет автозаполнения для строк в Xcode. Это делает работу не только подверженной ошибкам, но и утомительной.
- В конечном итоге вы можете переопределить строку просто потому, что не знали, что эквивалентная строка уже существует (например, «Пожалуйста, введите пароль» или «Сначала введите пароль»).
- Как и в случае с автозаполнением, вам нужно «запомнить» / скопировать строки комментариев, иначе в результате
genstring
получится несколько комментариев для одной строки. - Если вы хотите использовать
genstring
после того, как вы уже локализовали некоторые строки, вы должны быть осторожны, чтобы не потерять свои старые локализации. - Одинаковые строки разбросаны по всему вашему проекту. Например, вы использовали
NSLocalizedString(@"Abort", @"Cancel action")
везде, а затем Code Review просит вас переименовать строку в,NSLocalizedString(@"Cancel", @"Cancel action")
чтобы сделать код более согласованным.
Что я делаю (и после некоторых поисков в SO я подумал, что многие люди делают это), так это иметь отдельный strings.h
файл, в котором я #define
весь код локализации. Например
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
По сути, это обеспечивает автозавершение кода, единое место для изменения имен переменных (так что больше нет необходимости в genstring) и уникальное ключевое слово для авторефакторинга. Однако это происходит за счет целого ряда #define
операторов, которые по своей сути не структурированы (например, LocString.Common.Cancel или что-то в этом роде).
Итак, хотя это работает несколько нормально, мне было интересно, как вы, ребята, делаете это в своих проектах. Есть ли другие подходы к упрощению использования NSLocalizedString? Может быть, есть даже структура, которая инкапсулирует это?