Używam (jak wszyscy inni) NSLocalizedString
do lokalizowania mojej aplikacji.
Niestety, istnieje kilka „wad” (niekoniecznie wina samego NSLocalizedString), w tym
- Brak autouzupełniania dla ciągów w Xcode. To sprawia, że praca jest nie tylko podatna na błędy, ale także męcząca.
- Może się zdarzyć, że zmienisz definicję ciągu tylko dlatego, że nie wiedziałeś, że istnieje już równoważny ciąg (np. „Wprowadź hasło” zamiast „Najpierw wprowadź hasło”)
- Podobnie jak w przypadku problemu z autouzupełnianiem, musisz "zapamiętać" / skopiować ciągi komentarzy, w przeciwnym razie
genstring
skończy się wiele komentarzy dla jednego ciągu - Jeśli chcesz używać
genstring
po zlokalizowaniu niektórych ciągów, musisz uważać, aby nie stracić starych lokalizacji. - Te same struny są rozrzucone po całym projekcie. Na przykład był używany
NSLocalizedString(@"Abort", @"Cancel action")
wszędzie, a następnie Code Review prosi o zmianę nazwy ciąguNSLocalizedString(@"Cancel", @"Cancel action")
na, aby kod był bardziej spójny.
To, co robię (i po kilku poszukiwaniach na SO, doszedłem do wniosku, że wiele osób to robi), to posiadanie oddzielnego strings.h
pliku, w którym mam #define
cały kod lokalizacji. Na przykład
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
Zasadniczo zapewnia to uzupełnianie kodu, pojedyncze miejsce do zmiany nazw zmiennych (więc nie ma już potrzeby tworzenia genstringów) oraz unikalne słowo kluczowe do automatycznej refaktoryzacji. Jednak odbywa się to kosztem zakończenia całej masy #define
instrukcji, które nie są z natury uporządkowane (np. Jak LocString.Common.Cancel lub coś w tym rodzaju).
Tak więc, chociaż działa to dość dobrze, zastanawiałem się, jak robicie to w swoich projektach. Czy istnieją inne metody upraszczania korzystania z NSLocalizedString? Czy może w ogóle istnieje struktura, która ją zawiera?