Как работает localizedStringWithFormat?

Обратите внимание

Я не спрашиваю о NSLocalizedString() макросе. Я спрашиваю о функции класса NSString + (instancetype)localizedStringWithFormat:(NSString *)format, ....

Это две отдельные вещи.

Вопрос

Я пытаюсь использовать метод класса NSString localizedStringWithFormat, но я просто не могу понять, как я должен его использовать.

Что бы я ни пытался, мне кажется, что слова не появляются в файле перевода с использованием Xcode 6 export for localization. Я пробовал два верхних варианта здесь, но ничего.

Пример в документах показывает...

NSString *myString = [NSString localizedStringWithFormat:@"%@:  %f", @"Cost", 1234.56];

Означает ли это, что я должен отделять переведенные слова от цифр? то есть я мог бы не просто использовать...

NSString *myString = [NSString localizedStringWithFormat:@"Cost:  %f", 1234.56];

Если я могу использовать это, то какой будет переведенная фраза и каким будет перевод?

Если нет, то зачем вообще это использовать? Почему бы просто не использовать...

NSString *myString = [NSString stringWithFormat:@"%@:  %f", NSLocalizedString(@"Cost"), 1234.56];

В чем разница с этим последним?

В любом случае, может кто-нибудь показать мне, как перевести настоящие слова, пожалуйста.

Обновить

Хорошо, в данный момент я использую глупый обходной путь, который, кажется, неправильно использует все, лол.

If I do...

NSString *myString = [NSString stringWithFormat:@"%@:  %f", NSLocalizedString(@"Cost"), 1234.56];

Затем он перевел слово «Стоимость», но не использует правильную локаль для чисел.

Если я использую...

NSString *myString = [NSString localizedStringWithFormat:@"%@:  %f", @"Cost", 1234.56];
// or
NSString *myString = [NSString localizedStringWithFormat:@"Cost:  %f", 1234.56];

Затем Xcode «Экспорт для локализации» просто полностью игнорирует его, и ничего о «Стоимости» вообще не добавляется в файл перевода, поэтому ничего не переводится.

Итак, я прибег к использованию...

[NSString localizedStringWithFormat:@"%@:  %f", NSLocalizedString(@"Cost", @"Cost context stuff..."), 1234.56];

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


person Fogmeister    schedule 07.10.2014    source источник
comment
@матовый да, я видел это. Я просто не могу подобрать слова для перевода. Я перепробовал все, что мог придумать, но слова просто не появляются в файле перевода. Я получаю переведенный числовой формат, а затем английский текст.   -  person Fogmeister    schedule 07.10.2014
comment
@matt да, мы перевели на 15 языков и около 50 слов на каждый язык. Это единственный бит, который не работает. Я обновил вопрос сейчас.   -  person Fogmeister    schedule 07.10.2014
comment
@matt Я не уверен, что означают эти последние два комментария? Я знаю, что перевод зависит от меня. Я знаю, что локаль отличается от языка. Ни один из этих фактов не помогает мне перевести этот текст.   -  person Fogmeister    schedule 07.10.2014
comment
Я думаю, вы неправильно понимаете цель функции. Перечитайте спецификацию.   -  person Hot Licks    schedule 07.10.2014
comment
См. этот вопрос.   -  person Hot Licks    schedule 07.10.2014
comment
@HotLicks Хм ... но в этом вопросе не упоминается функция класса [NSString localizedStringWithFormat:...]. Из документов... Возвращает строку, созданную с использованием заданной строки формата в качестве шаблона, в который подставляются остальные значения аргументов в соответствии с текущим языковым стандартом. кажется, это то, что я использую. для. Пожалуйста, не могли бы вы объяснить, какой бит я неправильно понимаю?   -  person Fogmeister    schedule 07.10.2014
comment
Вы ошибочно полагаете, что строки будут заменены. Локализовано, например, использование . или , в качестве десятичной точки.   -  person Hot Licks    schedule 07.10.2014
comment
@HotLicks ах! Таким образом, упоминание локализованной строки как в NSLocalizedString, так и в localizedStringWithFormat является полным отвлекающим маневром, поскольку на самом деле они означают совершенно разные вещи. Спасибо, теперь я наконец понял. Хорошо, что им не дали имен, из-за которых они выглядели бы так, будто занимаются одним и тем же. (Хорошая шутка инженеров Apple, лол). Спасибо, теперь я понял.   -  person Fogmeister    schedule 07.10.2014
comment
@HotLicks назвал это ответом. Я приму это. Я думаю, что мне нужно сохранить это здесь, чтобы в следующий раз я не путал локализованную строку с локализованной строкой, лол.   -  person Fogmeister    schedule 07.10.2014


Ответы (1)


Когда вы думаете о NSLocalizedStrings, подумайте о ключе/значении. Вы можете сыграть некоторые трюки с ключом, например, во втором примере:

@"Cost:  %f"

Это ключ - значение, вероятно, будет выглядеть как @SomeOtherWord: %f, - %f впоследствии все еще используется как часть строки формата.

Последний пример, который вы привели:

NSString *myString = [NSString stringWithFormat:@"%@:  %f", NSLocalizedString(@"Cost"), 1234.56];

Позволяет вам отделить перевод слова «Стоимость» с помощью сброса строки, что может быть хорошо, но может быть недостаточно для эффективной передачи вашего значения на всех языках. Может быть, есть язык, который вы бы не назвали Label:value, тогда простой перевод стоимости не приведет вас к хорошей локализации.

NSLocalizedString может помочь в большинстве таких ситуаций, но локализация сложна и заполнена особыми случаями, поэтому в вашем коде тоже могут быть особые случаи — просто старайтесь изо всех сил изолировать их от остальной логики.

РЕДАКТИРОВАТЬ: Решение фактического вопроса по мере его развития:

localizedStringWithFormat:

Изменится способ замены спецификаторов формата.

Из документов Apple NSString:

Обсуждение

Этот метод эквивалентен использованию initWithFormat:locale: и передаче текущей локали в качестве аргумента локали.

person KirkSpaziani    schedule 07.10.2014
comment
Это то, что я сначала подумал (что текст был ключом). Но когда я использую его, в файлы перевода ничего не добавляется, чтобы на самом деле перевести его. Возможно, это ошибка в экспорте Xcode для функции локализации? - person Fogmeister; 07.10.2014
comment
Что произойдет, если вы сделаете это в два этапа? Сначала получите NSLocalizedString (ключ), затем выполните stringWithFormat:. Правильно ли XCode заполняет данные? - person KirkSpaziani; 07.10.2014
comment
Попробуйте версию командной строки: xcodebuild -exportLocalizations может дать полезный результат. Или, вероятно, это ошибка/отсутствующая функция в localizedStringWithFormat: - person KirkSpaziani; 07.10.2014
comment
Я узнал от @HotLicks, что localizedStringWithFormat вообще не переводится. Он локализует числовые форматы и т. д. Несмотря на то, что они имеют одно и то же имя localizedString, на самом деле они не означают одно и то же. Я использовал предложенный вами метод, за исключением использования localizedStringWithFormat..., и теперь все работает: D - person Fogmeister; 07.10.2014
comment
Я собираюсь отредактировать свой ответ, чтобы быть более точным. Документы спешат на помощь! - person KirkSpaziani; 07.10.2014