Friday, 2 September 2016

Локализация Ionic / Cordova приложения для iOS

При разработке гибридных мобильных приложений на Cordova можно неожиданно обнаружить, что все системные лейблы отображаются на английском языке. Такое поведение достаточно странно, а главное нежелательно, учитывая, что по задумке, все системные сообщения внутри приложения должны отображаться в соответствии с выбранным языком на iOS.

ionic-english-labels

Одно из найденных решений позволяет жёстко задать системный язык внутри приложения и избавляет от лейблов на английском, хотя и уменьшает гибкость, т.к. выбранный язык в настройках самого смартфона по-прежнему будет игнорироваться. Полагаю, что вам потребуется русский язык, но вы, разумеется, можете заменить «ru» на код необходимого языка.


<key>CFBundleLocalizations</key>
<array>
  <string>ru</string>
</array>

//paste and go build!

Файл YourProject-Info.plist для вашего проекта YourProject.xcodeproj находится в папке Resources в папке проекта. Откройте проект в xcode, найдите файл в папке Resources и откройте его через контекстное меню «Open As > Source Code». Вставьте приведённый выше код внутрь тега dict наряду с остальными парами параметров (проще всего вставить код сразу после открытия тега dict), сохраните файл и запустите билд. Теперь все системные лейблы переведены на русский.

ionic-russian-labels

Monday, 8 August 2016

Ускорение BrowserSync в Gulp процессе

Предположим, что у нас есть проект, который локально уже сервится на какой-то псевдо-хост через nginx или apache. Для скоростной разработки на front-end (и не только) нам, разумеется, хочется использовать какой-нибудь сборщик, например Gulp. Для live-reload отображения изменений в браузере мы используем BrowserSync, который умеет работать как прокси и сервить не собственно файлы, а некий хост.

gulp.task('server', function() {
  browserSync.init(null, {
    proxy: "project-host.local",
  });
});
//happy end!

В параметре proxy мы указываем адрес хоста, по которому доступен наш проект. Достаточно часто можно встретить локальные домены, заканчивающиеся на «*.local» или «*.home», так что пока мы не видим подвоха и запускаем gulp server (предварительно, разумеется, прописав все нужные задачи по компиляции и задачу watch для вызова перезагрузки страницы через BrowserSync), чтобы начать наслаждаться скоростной разработкой, но вместо этого получаем загрузку сайта как по старому неоплаченному dial-up соединению.

Как ни странно, дело в доменном адресе проекта. Пользователи BrowserSync недоумевают, но тем не менее, если поменять хвост домена на «*.dev», то на выходе мы получим реактивную загрузку страницы, если вдобавок ко всему добавим ещё и инъекции css без полной перезагрузки страницы, что BrowserSync, как и подобает live-reload сервису, тоже умеет.

gulp.task('server', function() {
  browserSync.init(null, {
    proxy: "project-host.dev",
  });
});
//happy end!

Чёткого объяснения этому явлению нет, но очевидно, что в деле замешан принцип поиска DNS-записей, который, например на MacOS, заставляет BrowserSync сначала искать страницу и все прилагающиеся к ней ресурсы сначала глобально, а только затем уже локально. При использовании домена «*.dev» BrowserSync сервит наш проект строго локально, что и приближает нас к заведомой цели скоростной разработки.

Saturday, 9 April 2016

Тернарная условная операция в CoffeeScript

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

function() {
  return true ? "true" : "false"
}
//happy end!

Это мог бы быть любой си-подобный язык, но в данном случае это JS, так как от него мы намерены двигаться в сторону диалекта CoffeeScript, который тоже может приглянуться DRY-снобам. Казалось бы, правила Coffee не ограничивают нас в путях написания однострочного кода, так что мы могли бы ожидать, что вышеописанная функция заработает и на CoffeeScript. Однако этого не произойдёт. Invalid, unexpected и вот это всё. Что же нам предлагают взамен старого доброго «:»?

function() {
  if true
    return true
  else
    return false
}
//happy end!

Вот так многословно, хотя и вполне читаемо. В куче кода глаз такое разберёт, наверное, даже лучше, учитывая, что условие и операторы, выполняемые в разных ветках, на практике могут быть куда длиннее, чем в примере выше. Хотя, когда такое происходит, даже самый стойкий блюститель чистого кода дрогнет и сделает рефакторинг в сторону старого-доброго if-else. Однако, что делать в случае, когда скрипт выполняется на наречии CoffeeScript, а условие требует какого-нибудь простого выбора из двух переменных по короткому булеву выражению? На просторах stackoverflow нашлась подсказка..

function() {
  return true && "true" || "false"
}
//happy end!

Запомнить несложно, главное не перепутать «И» с «ИЛИ». Чтобы понять, что «ИЛИ» надо поставить между вторым и третьим операндом, достаточно вспомнить, что суть тернарной операции в выборе между этими двумя операндами, т.е. выражение звучит дословно «второй ИЛИ третий операнд».