неділя, 27 вересня 2009 р.

Відмінювання слова «коментар» у шаблонах blogger

16 коментарів:
Як зробити щоб у Blogger слово «коментар» змінювалось відповідно кількості коментарів: 1 — коментар, 2-3-4 — коментаря, 5 та більше( до першої сотні :) — коментарів
До чого захоплюючою справою виявилось таке, на перший погляд нудне, заняття, як допилювання стандартного шаблону Blogger. У інтернеті опубліковано безліч різноманітних «хаків» перепубліковувати їх було б невдячною справою. Все, що можна зробити зі стандартним Blogger Templates читайте на сторінці «Мої закладки» у розділі «Блоґґер з напильником».
Я ж додам кілька власних винаходів.
Завдяки дієвій участі tivasykа  та Sandy сира ідея набула завершеної форми, перевершивши початковий задум.
Народ з blogger team намагається зробити універсальні шаблони для всіх часів, мов, народів. Добрі наміри догодити всім призводять іноді до появи невластивих українській мові шаблонно-казенних конструкцій на зразок:
1 коментарі(в); 2 коментарі(в); 3 коментарі(в);
Хоч це не принципово, для блога цінніший зміст, багато хто читатиме його тільки через рідер, але не хотілося б псувати перше враження, а невідповідність числівнику залишає відчуття якоїсь «общаги», загальної «блогоферми».
Познущавшись кілька вечорів над шаблоном я з'ясував:
<b:if cond='умова'>Якщо виконується ця умова
   <дія/>              робити це
 <b:else/>             інакше
   <дія/>              це
 </b:if>               кінець для цієї умови
іноді <b:else> пропускають, тобто, якщо умова виконується, робимо те, що між <b:if cond= " —&nbsp"> та </b:if> , інакше йдемо далі.
Залишилось з'ясувати значення перемінних.
Було б не цікаво шукати документацію по API, проміняти живе дослідження методом наукового тику на нудне читання, це «не наш метод» :) . Коли нічого не виходитиме тоді…
Інструкція до мобільного телефону Одеського виробництва: Ви такі открилі ету кніжку? Значіт теперь телефону реально конец, вот адреса людей которим будет інтересно купить ваш хлам.
data:post.numComments — кількість коментарів до допису
data:commentLabel — слово «коментар»
data:top.commentLabelPlural — слово: «коментарі»
Відкриваєм «панель інструментів» — «макет» — «редагуватиHTML»,
зберігаємо про всяк випадок шаблон,
ставимо галочку навпроти «Розширити шаблони елементів керування».
Розшукуємо де у нас виводиться кількість коментарів:
<div class='comments' id='comments'>
    <a name='comments'/>
    <b:if cond='data:post.allowComments'>
      <h4>
        <b:if cond='data:post.numComments == 1'>
          1 <data:commentLabel/>:
        <b:else/>
          <data:post.numComments/> <data:commentLabelPlural/>:
        </b:if>
      </h4>
Не фонтан :(
Приступаємо до тотальної примусової українізації.
Замінюємо вище наведений код цим:
<div class='comments' id='comments'>  

    <a name='comments'/>
    <b:if cond='data:post.allowComments'>
      <h4>
        <b:if cond='data:post.numComments == 0'>
         А Ви що скажете? :
        <b:else/>
        <b:if cond='data:post.numComments == 1'>
         1 коментар :
        <b:else/>
        <b:if cond='data:post.numComments &lt; 5'>
        <data:post.numComments/> коментаря :
        <b:else/>
        <b:if cond='data:post.numComments &gt; 4'>
        <data:post.numComments/> коментарів :
        <b:else/>
        <b:if cond='data:post.numComments &gt; 20'>
         коментарів : <data:post.numComments/>
        </b:if></b:if></b:if></b:if></b:if>
      </h4>
Пробіл між & та gt; потрібно прибратити, & та lt; також. Без пробілів браузер їх відобразив би як знаки більше і менше '>' '<' після вставки у шаблон це викликало б помилку.
Зберігаємо шаблон.
Якщо все зроблено як треба, одразу під дописом, на внутрішніх сторінках кількість коментарів відображатиметься так як у мене тут.
Наразі все.
Ні, не все.   Коментуючи,  тівасик  запропонував алгоритм:
достатньо вирахувати залишок від ділення data:post.numComments на 10 (в javascript: x%10) і тоді аналізувати в такому порядку (верхні варіанти виключають нижні):
x%10 = 5..9 --- коментарів
x%10 == 2..4 --- коментаря
x%10 == 1 --- 1 коментар
x%10 == 0 --- немає коментарів
А Sandy написав новий код
<b:if cond='data:post.allowComments'>
            <a class='comment-link' expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'/>
        <b:if cond='data:post.numComments == 0'>
         Нема <data:commentLabelPlural/>
        <b:else/>
        <b:if cond='data:post.numComments &gt; 20'>
         <data:post.numComments/> <script>
            switch(<data:post.numComments/> % 10){
              case 1: document.write("коментар:"); break;
              case 2:
              case 3:
              case 4: document.write("коментаря:"); break;
              default: document.write("коментарів:");
            }
         </script><noscript><data:commentLabelPlural/></noscript>
        <b:else/>
        <b:if cond='data:post.numComments == 1'>
         <data:post.numComments/> коментар:
        <b:else/>
        <b:if cond='data:post.numComments &lt; 5'>
         <data:post.numComments/> коментаря:
        <b:else/>
        <b:if cond='data:post.numComments &gt; 4'>
        <data:post.numComments/> коментарів:
         <b:else/>
        <data:post.numComments/> <data:commentLabelPlural/>
        </b:if></b:if></b:if></b:if></b:if>
Який я трохи змінив, встановлюючи на цей блог.
Остання редакція від Sandy для понад сто коментарів:

<b:if cond='data:post.numComments == 0'>
 Нема <data:commentLabelPlural/>
<b:else/>
<b:if cond='data:post.numComments &gt; 20'>
 <data:post.numComments/> <script>
     if(<data:post.numComments/> / 10 % 10 == 1) document.write("коментарів"); else
        switch(<data:post.numComments/> % 10){
           case 1: document.write("коментар"); break;
           case 2:
           case 3:
           case 4: document.write("коментаря"); break;
          default: document.write("коментарів");
        }
 </script><noscript><data:commentLabelPlural/></noscript>
<b:else/>
<b:if cond='data:post.numComments == 1'>
 <data:post.numComments/> коментар
<b:else/>
<b:if cond='data:post.numComments &lt; 5'>
 <data:post.numComments/> коментаря
<b:else/>
 <data:post.numComments/> <data:commentLabelPlural/>
</b:if></b:if></b:if></b:if>

тепер можна насолоджуватися.

До речі, Sandy зробив ще одну дуже корисну річ універсальний транслітератор рекомендую, транслітерація, правильна розстановка переносів, автоматична вставка типографських знаків замість звичайних лапок "" = «», дефіса -- =  —  і багато іншого.

16 коментарів:

Sandy :

Ду­же дя­кую. Шко­да, що не мож­на ос­тан­ню циф­ру тес­ту­ва­ти, але до 21 ко­мен­та­рів ме­ні ще да­ле­ко... ;)

ivanko :

В принципі можна було змінювати напис джаваскриптом, але мені не подобається коли на сторінці забагато скриптів. Варіант переходу від "20 коментарів:" до "коментарів: 21" і далі, непоганий компроміс.

до 21 ко­мен­та­рів ме­ні ще да­ле­ко... ;)
Хто знає, хто знає... :)

Sandy :

Встав­лю Javascript для біль­ше 20 ко­мен­та­рів. ;)
Ба­га­то скрип­тів це не до­дасть...

tivasyk :

вирішення проблеми >20 коментарів просте в теорії: достатньо вирахувати залишок від ділення data:post.numComments на 10 (в javascript: x%10) і тоді аналізувати в такому порядку (верхні варіанти виключають нижні):

x%10 = 5..9 --- коментарів
x%10 == 2..4 --- коментаря
x%10 == 1 --- 1 коментар
x%10 == 0 --- немає коментарів

але! засада: блогерські ‹b: if cond=''› не обробляють всередині 'cond' операнд %... плюс та мінус -- будь-ласка, працює, а ділення чи залишок -- ні...

якщо хто додумається, як обійти це обмеження -- тому буде слава і повага.

ivanko :

Дякую за алгоритм.
Хочеться слави і поваги ;) , та поки що красивого способу реалізувати безпосередньо у шаблоні не знайшов.

Обійти можна тільки якщо завантаживши зовнішній скрипт отримати кількість коментарів, виконати x%10 та дописати слово, для no scrypt залишити старий варіант.

Зацікавило, приділю трохи уваги вивченню JS. Зараз у мене дуже поверхові знання.

Sandy :

Усе прос­то:

<b:if cond='data:post.allowComments'>
<a class='comment-link' expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'>
<b:if cond='data:post.numComments == 0'>
Нема <data:commentLabelPlural/>
<b:else/>
<b:if cond='data:post.numComments &gt; 20'>
<data:post.numComments/> <script>
switch(<data:post.numComments/> % 10){
case 1: document.write("коментар"); break;
case 2:
case 3:
case 4: document.write("коментаря"); break;
default: document.write("коментарів");
}
</script><noscript><data:commentLabelPlural/></noscript>
<b:else/>
<b:if cond='data:post.numComments == 1'>
<data:post.numComments/> коментар
<b:else/>
<b:if cond='data:post.numComments &lt; 5'>
<data:post.numComments/> коментаря
<b:else/>
<data:post.numComments/> <data:commentLabelPlural/>
</b:if></b:if></b:if></b:if>

ivanko :

Дякую Sandy !
Моє шанування. Одразу побачив свої помилки.
Доречі про & amp; lt; для &lt; я також не подумав, користуватимусь.

tivasyk :

2sandy & ivanko
респекти. трошки пізніше буду гратися з шаблоном, спробую прикрутити цей бантик!

Sandy :

Я ще про 111 і біль­ше ко­мен­та­рів за­був... Це не пра­ви­ла, а жах якийсь... ;)

Ос­тан­ній ва­рі­ант.

ivanko :

Я ще про 111 і біль­ше ко­мен­та­рів за­був..
Не все од­ра­зу, спо­чат­ку по­до­ла­є­мо пер­шу сот­ню ;)

Уні­вер­саль­ний Транс­лі­те­ра­тор вра­зив, він ще й ко­ди зда­тен мо­ди­фі­ку­ва­ти для встав­ки на блог?!

Моє без­мір­не ша­ну­ван­ня!

Я вже раз спро­бу­вав на­би­ра­ти до­пи­са пря­мо у транс­лі­те­ра­то­рі, не­по­га­но. Не ви­ста­чає кно­по­чок зі стан­дар­т­ним на­бо­ром те­гів ( <b></b>,<i></i>,<a href=”” title=""></a> ), але я й так зви­каю на­би­ра­ти їх ра­зом із тек­с­том ;)

Sandy :

А я їх на­би­раю за до­по­мо­гою стан­дар­т­них кно­пок у Blogger піс­ля то­го, як встав­ляю ту­ди текст. Ну, я по­ду­маю...
Там на­справ­ді ба­га­то чо­го тре­ба до­да­ти, але часу ніколи не вистачає...

ivanko :

А я їх на­би­раю за до­по­мо­гою стан­дар­т­них кно­пок у Blogger
Там є нюанс, якщо перейти з режиму HTML у режим візуального редактору блогер понатикує </br> де треба і де не треба, ніякі розстановки галочок у налаштуваннях не допомагають. я ж використовую <p></p>.


часу ніколи не вистачає...

Це я дуже добре розумію, тому і хочеться мати зручний та інтуітивно зрозумілий інструмент. Здається найближче до цього підійшов scribefire, але переноси... У вільний час ще помучаю мавпочку

Sandy :

Мо­же ота­ке пі­ді­й­де?

ivanko :

Дя­кую Sandy, за­раз ви­про­бую, на пер­ший по­гляд є все що не­об­хід­но, на­віть тро­хи біль­ше :)

Тарас :

Повідміняти слово "коментар" для кількості коментарів - цікава думка, теж з цим зіткнувся міняючи шаблон і перівяючи написання коментарів. Але не став звертати уваги. Думаю піучитись трохи html, що поравити кольори і таке інше верхнього бар-меню. Якщо охота не пропаде, бо й так здається нормально.

ivanko :

Якщо охота не пропаде, бо й так здається нормально
Головне щоб не пропадало бажання вести блог, зрештою оформення вторинне, важливіший зміст.
Я заходив на ваш блог, вибрана вами тема найкраще пасує до змісту, легко читається, легко сприймати інформацію, зауважу лише, що особисто у мене бажання торкатися політичних тем зникло повністю.

Дописати коментар

Можна використовувати теги:
<i>курсив</i> <b>жирний</b>
<a href="http:// «адреса посилання» "> «текст» </a>

ще? :