Альтернативные строки для разных целей одного и того же приложения - использовать NSLocalizedString?
Я создаю версию приложения, которое я уже выпустил, но с некоторыми изменениями. Это не совсем облегченная / полная версия, но они достаточно похожи, и я использую один и тот же проект с другой целью.
Я хотел бы перефразировать почти все строки, которые я использовал в первой версии для новой версии, и мне было интересно, как лучше подойти к этому. Вместо того чтобы использовать операторы #ifdef/#else перед объявлением каждой строки, я подумал об использовании NSLocalizedStrings. Тем не менее, фактический язык остается прежним.
В этом посте я прочитал, что вы можете установить язык самостоятельно, так что, вероятно, я могу изобрести свой собственный язык и установить его на это. Но мне интересно, если это лучший способ идти о вещах? Любой совет будет приветствоваться.
3 ответа
Вы можете иметь несколько строковых таблиц для любого данного языка (то есть несколько .strings
файлы). Когда вы хотите локализованную строку, вы можете получить ее через:
NSString *str;
// Look up string in Full.strings
str = [[NSBundle mainBundle] localizedStringForKey:@"SomeKey"
value:@"DefaultValue"
table:@"Full"];
// Look up strings in Lite.strings
str = [[NSBundle mainBundle] localizedStringForKey:@"SomeKey"
value:@"DefaultValue"
table:@"Lite"];
Поскольку таблица для этого метода может быть переменной, вы даже можете переключать ее во время выполнения. Вышесказанное предполагает, что у вас есть Full.strings
стол и Lite.strings
Таблица.
Full.strings
"SomeKey" = "This string appears in the full version";
Lite.strings
"SomeKey" = "This string appears in the lite version";
Возможно, вы не захотите отправлять их вместе, если это так, вы можете настроить ваш Info.plist так, чтобы он содержал имя таблицы для использования для конкретной цели (если вы добавляете запись с именем "TableToUse"
Вы можете получить это через [[[NSBundle mainBundle] infoDictionary] objectForKey:@"TableToUse"]
)
NSLocalizedStrings - это макрос, определенный как
#define NSLocalizedString(key, comment) \
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
Если для параметра таблицы установлено значение nil, код будет использовать значение по умолчанию "Localizable", поэтому, если мы добавим еще один локализованный строковый файл, мы должны вызвать [[NSBundle mainBundle] localizedStringForKey:value:table:
непосредственно вместо вызова NSLocalizedStrings
Я бы очень неохотно изобрел свой собственный язык, но вам, вероятно, и не нужно. Если вы используете NSLocalizedString в соответствующих местах, а затем используете genstrings для извлечения их в Localizable.strings (см. Документы), то вы можете просто получить две версии этого файла и затем скопировать правильную версию в каждую цель.