Как стать автором
Обновить

Комментарии 33

Однако, это работает не всегда. В некоторых приложениях перевод бывает далек от идеала — слова не помещаются на кнопках, или выглядят переведенными с помощью неумирающего Prompt'а, или просто раздражает, что перевели текст, но не локализовали картинки. Хочется видеть приложение цельным, поставить английский язык и пользоваться в свое удовольствие. Некоторые предоставляют такую возможность, и я предлагаю разобраться, как именно они это делают.

а не проще ли сразу сделать перевод не Prompt'ом, размер кнопок нормальным, а картинки локализованными?
Это юзеру решать — мне, например, какие-то программы проще воспринимать на русском, хоть язык системы установлен английский.
Не проще. Автор врядли сможет повлиять на всех девелоперов. :) Да и проблемы установки рускоязычного приложения на англоязычный телефон с автоматическим определением локализации это не решит.

Пример из жизни. У меня айфон с английской локализацией. Устанавливаю детскую игру из русского апстора и получаю все инструкции и картинки на английском языке. На русский она переключается только при смене языка в настройках телефона, что неудобно для меня. Английский язык пока еще неподходит для дочки. Почти тупиковая ситуация.
А мы вот постарались в своих книгах устранить эту проблему и сделали переключение языка внутри приложения. Хотя у нас система попроще (или посложнее, как посмотреть), чем у автора этой статьи.
Молодцы! Мы пошли другим путем. Решили сделать 2 отдельных приложения. В нашем случае это оказалось более логичным решением. :)
Я в свое время использовал такую функцию ( было давно )

Не очень правильно было использовать число для идентификации языка но тем не менее код нормально работал

static NSBundle* saved_language_bundle = nil;
static int saved_language = -1;

NSString* languageSelectedString(NSString* x1)
{
NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];
NSString * result = nil;
int language = [[prefs valueForKey:@"uoslanguage"] integerValue];
if (language == 2) // это проверка того что все строки локализуются - включашеь язык и на тех формочках где нге то что тебе надо не появляется тест
{
return @"test";
}
if ( language == saved_language ) // бандл грузится только 1 раз
{
result = [saved_language_bundle localizedStringForKey:x1 value:@"" table:nil];
} else
{
saved_language = language;
if ( language == 1)
{
NSString* path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
saved_language_bundle = [NSBundle bundleWithPath:path];
result = [saved_language_bundle localizedStringForKey:x1 value:@"" table:nil];
}
else if ( language == 0)
{
NSString* path = [[NSBundle mainBundle] pathForResource:@"ru" ofType:@"lproj"];
saved_language_bundle = [NSBundle bundleWithPath:path];
result = [saved_language_bundle localizedStringForKey:x1 value:@"" table:nil];
} else
result = @"error";
}
return result;
}

какая то проблема с форматированием
gist.github.com/1922569
Ну да, по факту то же самое, скомпанованное в одну функцию :)
Да, вдруг кому поможет или будет удобнее
Это, конечно, не совсем по теме статьи, но в интерфейсах приложения smart coin, которое вы упомянули в статье, странноватый английский: choose currency from a complete list — э?..
Ну и таких ляпов много, даже на скриншотах приложения, выложенных в айтюнсе.
Очевидно, Ваш английский лучше моего :)).

Не затруднит прислать список «странных» фраз в личку? Хотя бы тех, что сразу бросаются в глаза.
Не затруднит, конечно. Отправил в личку.
может и сюда — как было/стало? чтоб знать :)
«Сразу оговорюсь, что моего английского достаточно, чтобы видеть неточности, которые скорее всего заметит носитель языка, но недостаточно, чтобы предложить абсолютно верный, «нативный» вариант перевода. Тем не менее, попытаюсь предложить более правильные варианты перевода. Если у вас есть под рукой носитель языка — лучше прогнать тексты через него.

Add a favorite currency -> add currency to favouries
to choose a favourite currency, pick and place it -> pick and place this currency to favourites
update rates -> update exchange rates
choose currency from a complete list -> browse full list of currencies»
*favouriTes, конечно же.
В общем, еще и через word тексты прогоните)
Спасибо!
А как теперь из кода строчки выдернуть? Макросы мы заменили и genstrings видимо поломается?
man genstrings:

-s routine
Substitutes routine for NSLocalizedString. For example, -s MyLocalString will catch calls to MyLocalString and MyLocalStringFromTable.


;)
Ага, написал и уже потом подумал, что подобное умеет эта тулза. Спасибо.
Этот подход будет ну очень актуален в приложения с локализацией на языки, локаль которых не поддерживается в iOS в принципе, на пример латышский или азербайджанский.

Сам лично как раз подошел к этой проблеме в своем проекте, огромное спасибо автору.
Да, получается, что это бесплатный бонус :)
Есть такое понятие как NSBundle — набор локализованных ресурсов приложения.

Это неправильное определение понятия Bundle.
An NSBundle object represents a location in the file system that groups code and resources that can be used in a program. NSBundle objects locate program resources, dynamically load and unload executable code, and assist in localization.
Вот именно, бандл это совокупность всех ресурсов приложения, если разговор идет про iOS.
во-первых, я нигде не говорил про то, что мое определение отличается 100% точностью
во-вторых, я вел разговор про локализацию и в контексте этого разговора определение правильное
в-третьих, мне совершенно непонятна ваша придирка к этой мелочи, которая на суть повествования вообще никак не влияет.
Я всего лишь указал на неточность в хорошей статье с целью помочь автору сделать её еще лучше и точнее.
Если бы вы посоветовали как лучше или правильнее написать, то я бы с радостью принял такую помощь. В первом же комменте вы просто кинули «это неправильное определение», но никак не «определение неточное, вот так было бы лучше ...». Это, как мне кажется и есть разница между придиркой и указанием на неточность с целью помочь.
Было бы здорово увидеть код как вьюшик рефрешатся при получении нотификейшена…

Неужели ручками для каждого вью реализацию писать и обновлять все контролы с текстом?
В моем случае лейблов было не сильно много, посему, да, обновлял контролы ручками. Если текстовых элементов на экране много, то можно что-то другое придумать.
вот и хотелось бы узнать, если что что-то другое…

Было бы здорово если бы такое обновление всего текста во вьюхах делалось самой Cocoa — тем более что вроде есть стандартный эпловский notification оповещающий о смене локали.

Ведь есть же функция итерации по всем subwindow, может ее как-то можно использовать…
Вряд ли изменение локали будет затрагивать уже отображенные UILabel'ы, им надо обязательно сделать setText и у меня есть большие соменния в том, что система сделает это за вас.

Касательно функции итерации по вьюшке не знаю, ее можно легко написать самому. Вопрос где хранить айдишник строки для данного label'а и во время итерации, соответсвтенно, делать [… setText:MALocalizedString(blah, blah)]
Вот очень странно, я не увидел самого ожидаемого комментария: у все этой идеи есть проблема — алерты системы. К примеру, с просьбой ввести логин и пароль при покупке. Они будут локализованы языком системы. И вы никак не решаете эту проблему.
Наверное потому, что эту проблему без перезапуска решить невозможно :)
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории