Комментарии 24
спасибо за ваше решение!
Статья в очередной раз вызвала у меня вопрос — ведь это же максимально распространенная задача: удобная кроссплатформенная локализация с теми фичами, о которых вы пишите. Разработка мобильных приложений появилась не вчера. Почему же нет удобного и массового решения этой задачи? Или я просто не знаю о нем?
Статья в очередной раз вызвала у меня вопрос — ведь это же максимально распространенная задача: удобная кроссплатформенная локализация с теми фичами, о которых вы пишите. Разработка мобильных приложений появилась не вчера. Почему же нет удобного и массового решения этой задачи? Или я просто не знаю о нем?
Вопрос скорее риторический. Хотя iOS появилась далеко не вчера, многие вопросы до сих пор остаются нерешенными и неудобными, так как над системой работают такие же люди как и мы.
А для Android что-то подобное уже существует?
Могу предложить свое решение: LocoLaser: переводим приложения в Google Sheets
Работает с Android и iOS. Ресурсы находятся в гугл таблицах. Умеет генерировать Swift и Obj-C классы. Есть плагин для Gradle.
Работает с Android и iOS. Ресурсы находятся в гугл таблицах. Умеет генерировать Swift и Obj-C классы. Есть плагин для Gradle.
А как в вашей системе разработчику добавить строку, чтобы ее увидели в команде локализации? Закоммитить в submodule?
Да, всё верно.
А как у вас происходит согласование строк? Если все будут коммитить в один репозиторий, то случится дублирование строк. Вы договариваетесь до коммита? К
Почему нельзя создать подкласс локализованного лейбла, который будет по ключу в шаблоне брать нужные строки? Или это и есть через storyboard? Если да, то ваших минусов можно избежать. Кроме первого пункта, но это не минус. В коде все так же разбросанно, а если все собрать в одном месте, то это глобальные переменные и свалка. Или нет?
Создание сабклассов под эту задачу смысла вообще не имеет. В сториборде имеется в виду, что вы локализуете конкретно каждый сториборд, есть такая нативная фича, что под сторибордами создаются файлики с элементами и текстами. Но опять же есть куча минусов помимо указанных выше. Самый главный — нельзя вставить динамический текст без написания это в коде.
Что же касается разброса локализации в коде, то скорее это огромный минус чем плюс. При появлении нового языка, вам вместо одного места, в которое нужно добавить новые данные, необходимо искать все места, где нужно что-то менять.
Что же касается разброса локализации в коде, то скорее это огромный минус чем плюс. При появлении нового языка, вам вместо одного места, в которое нужно добавить новые данные, необходимо искать все места, где нужно что-то менять.
Вторая статья на тему локализаций за последний месяц и опять со своим велосипедом )) Я например использую нативные методы, локализация storiboard + локализация в строках и ничем меня это не коробит.
Любое решение имеет место быть.
Плюсы нашего в отличии от нативного указаны в статье.
Главные из них:
— кроссплатформенность
— ошибки при изменении сразу находятся на этапе компиляции, а не в продакшене у юзера
— отсутствие магических строк в сторибордах и коде.
А что использовать в своих проектах, это решать каждой команде в зависимости от потребностей и нужд. Есть огромное количество проектов, которые не имеют и намека на локализацию и при добавлении нового языка это выльется в большое количество человеко-часов.
Плюсы нашего в отличии от нативного указаны в статье.
Главные из них:
— кроссплатформенность
— ошибки при изменении сразу находятся на этапе компиляции, а не в продакшене у юзера
— отсутствие магических строк в сторибордах и коде.
А что использовать в своих проектах, это решать каждой команде в зависимости от потребностей и нужд. Есть огромное количество проектов, которые не имеют и намека на локализацию и при добавлении нового языка это выльется в большое количество человеко-часов.
Работа со строками в iOS сделана таким образом, что невозможно иметь общую строковую базу на несколько платформ и не городить при этом велосипедов. Очевидно, вы разрабатываете только под iOS и не сталкивались с этой проблемой.
PS: хотел третью статью написать. Но видимо придется повременить. :)
PS: хотел третью статью написать. Но видимо придется повременить. :)
замена магических строк на константы которые проверяет компилятор, схожий подход в статье https://habrahabr.ru/company/tinkoff/blog/271459/
Не совсем схожий, так как у них в итоге генерируется в конце
NSLocalizedString(LocKey_main_continue, @"")
А у нас просто String.lockLeyMainContinue
Но идея в целом похожа
NSLocalizedString(LocKey_main_continue, @"")
А у нас просто String.lockLeyMainContinue
Но идея в целом похожа
Не приведет ли такое количество констант к увеличению времени запуска приложения?
К вопросу про время компиляции — безусловно увеличивается, ровно как и любой run script в билд фазе. Однако, в сравнении с swiftlint статическим анализатором, то время на порядок меньше занимает.
Что касается увеличение времени запуска, то опять же смотря какого. Если имеется в виду холодный запуск приложения, то естественно да, так как все строка хранятся в static memory. Но при замерах, которые мы проводили разница в проекте с 1000 строк просто микроскопическая что находится в пределах статистической погрешности.
Да, и если интересует жестко вопрос оптимизации времени запуска приложения, особенно на свифте, то рекомендую посмотреть видео-запись доклада с прошедшей конференции мобиуса (видео будут через неделю), там это детально расписано и получаются конкретные цифры, а не абстрактные. (Не знаю можно ли в комментах рекламировать видео или нет :)
Что касается увеличение времени запуска, то опять же смотря какого. Если имеется в виду холодный запуск приложения, то естественно да, так как все строка хранятся в static memory. Но при замерах, которые мы проводили разница в проекте с 1000 строк просто микроскопическая что находится в пределах статистической погрешности.
Да, и если интересует жестко вопрос оптимизации времени запуска приложения, особенно на свифте, то рекомендую посмотреть видео-запись доклада с прошедшей конференции мобиуса (видео будут через неделю), там это детально расписано и получаются конкретные цифры, а не абстрактные. (Не знаю можно ли в комментах рекламировать видео или нет :)
Как по мне, так отдавать переводчикам JSON — неблагодарное дело. Обязательно что-то поломают. Код-ревью в этом случае выглядит как костыль.
Также, замечу, тема локализации Storyboard не раскрыта. Или вы готовите еще одну статью?
Также, замечу, тема локализации Storyboard не раскрыта. Или вы готовите еще одну статью?
Даже если что-то поломают, то у нас проект просто не соберется. Именно в этом прелесть данного подхода.
Про локализацию storyboard, также указано, что эту проблему мы решаем протянув аутлеты в код, вместо того, чтобы локализовывать сами сториборды. Причины также указаны почему так сделано.
Но в целом, естественно всегда присутствует человеческий фактор) Вопрос лишь к сведению его к минимуму
Про локализацию storyboard, также указано, что эту проблему мы решаем протянув аутлеты в код, вместо того, чтобы локализовывать сами сториборды. Причины также указаны почему так сделано.
Но в целом, естественно всегда присутствует человеческий фактор) Вопрос лишь к сведению его к минимуму
Возможно вам стоит взглянуть вот на этот подход: Удобная локализация iOS приложений в Interface Builder
Это та самая «первая» статья из двух за месяц. В ней я рассказал как можно избавится от аутлетов.
Это та самая «первая» статья из двух за месяц. В ней я рассказал как можно избавится от аутлетов.
Что происходит, если один и тот же label в сториборде может иметь разный текст? Как решается это в данном подходе?
Именно поэтому мы и решили сделать систему консистентной, а тут как говорится «лес рубят, щепки летят».
Именно поэтому мы и решили сделать систему консистентной, а тут как говорится «лес рубят, щепки летят».
На самом деле, есть ряд сервисов для групповой работы с переводами, которые дадут тот самый GUI для переводчиков. Суть затеи при этом не поменяется.
Кодогенерация — зачетная мысль.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Упрощение локализации в iOS