Альтернативные строки для разных целей одного и того же приложения - использовать NSLocalizedString? - PullRequest
7 голосов
/ 21 февраля 2011

Я создаю версию приложения, которое я уже выпустил, но с некоторыми изменениями.Это не совсем облегченная / полная версия, но они достаточно похожи, и я использую один и тот же проект с другой целью.

Я хотел бы перефразировать почти все строки, которые я использовал в первой версии для новой версии, и мне было интересно, как лучше всего подойти к этому.Вместо того чтобы использовать операторы # ifdef / # else перед объявлением каждой строки, я подумал об использовании NSLocalizedStrings.Тем не менее, фактический язык остается прежним.

Я прочитал в этом посте , что вы можете установить язык самостоятельно, так что, вероятно, я могу изобрести свой собственный язык и установить его на этом.Но мне интересно, если это лучший способ идти о вещах?Любой совет будет приветствоваться.

Ответы [ 3 ]

12 голосов
/ 21 февраля 2011

Вы можете иметь несколько строковых таблиц для любого заданного языка (то есть нескольких .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"])

2 голосов
/ 27 мая 2015

NSLocalizedStrings на самом деле является макросом, определенным как

#define NSLocalizedString(key, comment) \
        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

Если для параметра таблицы задано значение nil, код будет использовать значение по умолчанию " Localizable ", поэтому, если мы добавим еще один файл локализованной строки, мы должны вызвать [[NSBundle mainBundle] localizedStringForKey:value:table: напрямую вместо вызова NSLocalizedStrings

0 голосов
/ 21 февраля 2011

Я бы очень не решился бы изобрести свой собственный язык, но вам, вероятно, и не нужно.Если вы используете NSLocalizedString в соответствующих местах, а затем используете genstrings для извлечения их в Localizable.strings (см. docs ), то вы можете просто иметь две версии этого файла и затем копировать правильную версию в каждуюцель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...