Я (как и все остальные), используя NSLocalizedString
, чтобы локализовать мое приложение.
К сожалению, существует несколько "недостатков" (не обязательно ошибка самой NSLocalizedString), включая
- Нет автозаполнения для строк в Xcode. Это делает работу не только подверженной ошибкам, но и утомительной.
- Вы можете в конечном итоге переопределить строку просто потому, что не знали, что уже существует эквивалентная строка (например, "Пожалуйста, введите пароль" или "Введите пароль сначала" )
- Сходным образом с проблемой автозаполнения вам нужно "запомнить" /copypaste строки комментариев, иначе
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);
Это, по сути, обеспечивает завершение кода, одно место для изменения имен переменных (так что больше не требуется генерации) и уникальное ключевое слово для авторефрактора. Однако это связано с тем, что заканчивается целым рядом операторов #define
, которые по своей сути не структурированы (например, LocString.Common.Cancel или что-то в этом роде).
Итак, хотя это работает несколько отлично, мне было интересно, как вы, ребята, делаете это в своих проектах. Существуют ли другие подходы к упрощению использования NSLocalizedString? Может быть, даже инфраструктура, которая инкапсулирует его?