Я (як і всі інші) використовую 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);
Це по суті забезпечує доповнення коду, єдине місце для зміни назв змінних (тому більше не потрібно вводити рядки) та унікальне ключове слово для автоматичного рефактора. Однак це відбувається за рахунок закінчення цілого ряду #define
висловлювань, які за своєю суттю не структуровані (наприклад, як LocString.Common.Cancel або щось подібне).
Тож, хоча це працює дещо добре, мені було цікаво, як ви, хлопці, робите це у своїх проектах. Чи існують інші підходи для спрощення використання NSLocalizedString? Чи, можливо, існує навіть рамка, яка його інкапсулює?