Показаны сообщения с ярлыком Артемий Лебедев. Показать все сообщения
Показаны сообщения с ярлыком Артемий Лебедев. Показать все сообщения

Чудовищная верстка

Впечатлен o_O.

Наткнулся на сайт RBE Group, сделанный Студией Лебедева.

Это жесть.
Выглядит, конечно, красиво, но насколько неудобно этим пользоваться! Особенно если попробовать стрелками на клавиатуре сайт скроллить - он от этого в бесконечное дерганье попадает (браузер Chrome, последний).

Йоптить.
Не ну не видели они что ли? На чем тестировали?

Антикорпоративный галстук

Ради такого стоит пойти работать в какую-нибудь компанию, где есть дресс-код :).

Локализация XSL, PHP и JavaScript из одного XML источника

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

В проекте WikiCrowd нам понадобилось сделать локализацию. Мы используем XSL для генерации UI, backend написан на PHP и еще есть много JavScript'а. И на всех уровнях нужно выводить локализованный текст.

XSL

С XSL все достаточно просто. Очень хорошее описание локализации XSL есть на сайте Студии Лебедева. Для каждого языка получается отдельный XML файл:

<locale language="English">
<message id="AccessRights" text="New user rights"/>
...

Который подключается к XSL-шаблону:

<xsl:variable name="locale" select="document(concat('locale/', $LOCALE, '.xml'))/locale"/>

Локализованную строку подставляем так:

<xsl:value-of select="$locale//message[@id='Logout']/@text"/>

Его же мы решили использовать для локализации PHP и JavaScript компонент.

PHP

В PHP мы решили сделать из локализованных строк константы в отдельном namespace (чтобы случайно не пересечься) и определили функцию для обращения к ним:

$dom = new DOMDocument();
$dom->load('xml/locale/'.LOCALE.'.xml');
$messages = $dom->getElementsByTagName('message');
for($i = 0; $i < $messages->length; $i++) {
    $message = $messages->item($i);
    define('locale\\'.       $message->getAttribute('id'), $message->getAttribute('text'));
}

function getMessage($id) {
    return str_replace('\\n', "\n", constant('locale\\'.$id));
}

Там, где нужна локализованная строка, используем вызов getMessage('Configure').

JavaScript

С JavaScript оказалось все немного сложнее, потому что понадобилось локализовать не только статические строки, но и алгоритм :). Для удобства чтения мы выводим дату в формате "изменение произошло 3 часа 25 минут назад", и простой локализацией "часов" и "минут" оказалось недостаточно, потому что в русском языке алгоритм определения окончания не такой тривиальный, как, например, в английском (1 minute, 2+ minutes).

Так в XML-файле с локализованными строками появились локализованные функции:

<function id="getDaysText" params="days"><![CDATA[return days + " day" + (days > 1 ? "s" : "");]]></function>

Из локализованных строк и функций с помощью XSL генерируется исходник на JavaScript:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:php="http://php.net/xsl"
  exclude-result-prefixes="">
  <xsl:output
    method="text"
    version="1.0"
    indent="no"
    encoding="utf-8"
    omit-xml-declaration="yes"
    media-type="text/plain"
    cdata-section-elements=""/>

  <xsl:template match="/">
var Locale = {
<xsl:apply-templates select="//message"/>
<xsl:apply-templates select="//function"/>
  getMessage: function(id) {
    var text = this[id];
    for(var i = 1; i <xsl:text disable-output-escaping="yes"><</xsl:text> arguments.length; i++)
      text = text.replace('%' + i, arguments[i]);
    return text;
  }
};
  </xsl:template>

  <xsl:template match="message">
    <xsl:variable name="ap">'</xsl:variable>
<xsl:value-of select="@id"/>: '<xsl:value-of select="php:functionString('jsStringReplace', @text)" disable-output-escaping="yes"/>',
</xsl:template>
  <xsl:template match="function">
<xsl:value-of select="@id"/>: function(<xsl:value-of select="@params"/>) {
<xsl:value-of select="text()" disable-output-escaping="yes"/>
},
</xsl:template>

</xsl:stylesheet>

Как вы могли заметить, мы используем в PHP-расширение, позволяющее вызывать функции PHP из XSL-шаблона. Функция jsStringReplace() заменяет некоторые символы, чтобы JavaScript-код получится правильным:

function jsStringReplace($str) {
  return strtr($str, array('\''=>'\\\'', '&lt;'=>'<', '&gt;'=>'>'));
}

Обращение к локализованной строке выглядит так: Locale.Change.

До сих пор этот вариант локализации работает отлично.

Проверьте, улыбнулся ли вам смайлик Артемия Лебедева

Смайлик Артемия Лебедева теперь не только умеет смотреть, кто про вас писал, но еще и автоматически включит ваш блог в «улыбающийся» список.

Проверьте, улыбнулся ли вам смайлик Артемия Лебедева.

Смайлик Артемия Лебедева постепенно расползается по блогам ;-)

Какое-то время назад мы утащили смайлик Артемия Лебедева и стали раздавать его каждому, кому он улыбнулся (кстати, теперь есть плагины для Wordpress и Drupal).

Постепенно смайлик стал располаться по блогам. На сегодняшний день он замечен:

Также хочу сказать спасибо за предложения, которые я получил от блоггеров, натянувших смайлик Лебедева :) В следующей версии смайлка я их обязательно учту.

А вы уже поставили к себе на блог смайлик Артемия Лебедева?

Смайлик Артемия Лебедева: плагины для WordPress и Drupal, а также инструкции по установке

Я перетащил все данные по смайлику Артемия Лебедева на отдельную страницу: artsmile.motivateme.ru.

Там же есть плагины для WordPress и Drupal.

КПД Апокалипсиса

Несколько раз проходя мимо кинотеатра, замечал постер фильма «КПД Апокалипсиса». Даже любопытно стало, что это за КПД такой :)

КОД Апокалипсиса

Реальность оказалась банальнее. Неужели нельзя было букву «О» нормально прописать? Мало Лебедев всем по рукам дает?

Вообще, все говорит о том, что дизайнеру очень не нравилось делать эту работу. Одна только траурная рамка вокруг даты чего стоит. Некоторую многозначность вносит, что ли. Тут или апокалипсис будет 4 октября, или облом с первого дня проката, или еще что-то зловещее :)

К чему я это пишу? Все просто: народ, не выпендриваемся, дизайн наших проектов должен служить людям. Пусть даже это будут просто черные буквы на белом фоне шрифтом “Times New Roman”, главное, читать было удобно.

Смайлик Артемия Лебедева украден :-)

Я украл смайлик у Артемия Лебедва :-) Сейчас расскажу обстоятельнее.

Последнее время стало модно ставить ссылку на сайт Артемия Лебедева, потому что он (сайт) обладает одной замечательной особенностью — в правом верхнем его углу есть смайлик, нажав на который можно посмотреть, кто и что пишет, ссылаясь на данную страницу. А т.к. сайт Лебедева читает ежедневно туча народу, кто-нибудь по этим ссылкам да кликнет. Особенно, если они сопровождаются осмысленным текстом.

Конечно, это очень простой способ получить трафик на свой блог — написал что-нибудь, поставил ссылку и народ повалил. Я один раз попробовал так сделать, и на мой сайт пришло 140 дополнительных человек. Другое дело, что народ этот редко задерживается.

А теперь про смайлик. Собственно, мне так понравилась эта идея... Артемий, прости меня, я её у тебя наглым образом скомуниздил и прицепил на свой сайт про мою книжку о мотивации (которую ты, кстати, отказался однажды прочесть — глупость, конечно, но осадочек остался :))

В общем, теперь у меня тоже есть смайлик Артемия Лебедева. Только теперь он стал вот таким хитрым: (-;

Но мне и этого показалось мало. Я готов поделиться улыбкой Артемия Лебедева со всеми желающими. Хотите улыбку к себе на сайт? Нет ничего проще: artsmile.motivateme.ru.

Update: С подачи Вдохновенного Тормоза вот server side версия на PHP.

Update 2: Теперь и в виде плагина для Wordpress и Drupal.