спонсори:

Локалізація для української мови


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

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

Коротко про важливе

Вітання!
Після коментарів побачив, що проблема зарита набагато глибше - люди, що пишуть блоги - необов'язково розбираються в самій системі, з допомогою якої вони їх пишуть.

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

У випадку української мови - ситуація погіршена тим, що, не зважаючи на те, що нас ~48 мільйонів - пишемо сайти ми криво. І розробники пошукових систем та роботів просто не зустрічають в своїх логах використання української мови в обсязі, достатньому для включення її в список підтримуваних.

Все було б добре, якщо б поряд з українською не було таких схожих мов як російська та білоруська. Ну і інших, слов'янських також. Крім того, у нас відсутній справді локальний пошуковий робот, морфологія якого чітко підтримувала б українську мову.

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

Локалізація - справа складна і головна причина проблеми - людська лінь.

Чому?

Бо ставлячи собі на хостінг якийсь двигунець, людина стикається із необхідністю відображати в себе на вебсторінках якісний контент, щоб привернути увагу людей саме чистотою згенерованого коду. Думаю ніхто не буде особливо зачитуватись творами мистецтва, що написані "руско-польсько-украйонською" мовою. В більшості випадків локалізація закінчується лише на стадії перекладу головних мовних слів, які найчастіше зустрічаються на вебсторінках. Це вже непогано! Але зло в тому, що для людей - це добре! І якщо у Вас немає проблем із відвідуваністю вебсайту, і Вас абсолютно не цікавить індексація в пошуковиках - на цьому справді можна зупинитись! Навіть якщо у Вас в коді вказано, що мова сайту китайська - головне, щоб у Ваших користувачів все коректно відображалось. Але якщо у Вас все зав'язано на пошукові сервіси та на відвідуваність по ключовим словам - дуже погано, що на Ваш сайт заходять не по тим запитам, по яким повинні заходити користувачі. Для Вас - ця стаття.

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

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

Отже - поставили Ви двигунець, підібрали для нього тему і почали формувати цікаві статті. Нехай мова буде українською. Просто для прикладу і просто по причині того, що цю статтю будуть читати саме україномовні сайто-активісти 8). Після інсталяції та підбору теми у Вас на сайті вже кілька проблем. З ними можна жити, але важко, бо вони будуть відтягувати успішність Вашого проекту.

Чому?

Приклад поряд. Цей блог - працює на друпалі, використовує тему з відкритих шаблонів. Друпал - написаний англомовними авторами (головна його частина), тема "намальована" взагалі арабом, якщо не помиляюсь. Візуально все ок, але заглянувши глибше - вияснив, що володіючи мистецтвом дизайну та здатністю написати толкове ядро, не будеш профі в локалізації цього всього для невідомої мови.

І дійсно! Для чого їм щось формувати з глибиною розуміння, що їхнє творіння буде використовуватись в країнах, мови яких практично не підтримуються пошуковиками? Підтверджую - не варто!

Більше того, проблема справді не в них! Чи сильно Ви задумувались, щоб Ваш україномовний блог гарно індексувався в англомовних пошукових сегментах інтернету? Гадаю ні.
Отже - про проблеми, з якими стикнувся я!

  • Перша - відсутність повноцінного перекладу автоматичних інтерфейсних елементів, що можна іноді зустріти і зараз(лінь мені);
  • друга - HTML сформовано саме автором теми і його не хвилювала багатомовність. Можливо саме через ці проблеми я забрав копірайти - це моє "фе" авторам.

Все, що Ви бачите - це повноцінно перероблена система, на базі друпалу і теми Internet Services, знайденої мною давно на просторах інтернету.
Після повної локалізації в мене конкретно впала відвідуваність.

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

Отже - згідно статистики - пропали одиночні входи по певним ключовим словам, результатом якого було - зайшла людина, побачила - "не те" і закрила вікно. Зате почали рости входи, результатом яких є глибина проникнення більше 2-3 кліка - тобто це і є аудиторія, якій цікаво про що я тут понаписував.
Одночасно з цим почав дуже серйозно рости рейтинг по Alexa. Та й Яндекс почав обробляти сторінки, хоча закономірністю останнє я не можу назвати(В цей же час і MSN зробив повний індекс сайту за одну ніч, залишивши всі сторінки з максимальним рейтингом в себе в кеші - хоча це також не показник).
Це щодо побічних факторів локалізації, якою я на сьогоднішній день задоволений, хоча і не рахую її завершеною.

Сподіваюсь, Ви зроузуміли трошки суть, тепер технічна сторона.

Система друпал базується на шаблонах, якими виступає виключно тема!
Тобто розробники самого ядра зробили все можливе, щоб зробити локалізацію максимально простою, але люди, що формують ці шаблони не особливо читають документацію, тому багато нюансів не враховують.
Перший нюанс - стандарт багатомовності сторінок, про який я писав в попередніх статтях. Другий - відсутність підтримки пошуковиками багатомовності, що є загальною проблемою для нас і про що я розповім пізніше.
Отже, власникам друпалу дуже сильно раджу прочитати гіди по створенню тем для друпала. Це складно! І мова там "неукраїнська", але важливо, щоб мозок бачив технічну сторону процесу.
Після прочитання Theme API Ви мали зрозуміти структуру "теми", як об'єкту системи друпал. Головним елементом в цьому виступає шаблон page.tpl.php
Відкривши його Ви зустрінетесь одразу з мовою php. Я навантажив Вас прочитанням Theme API , тому не буду навантажувати вивчення мови php, в принципі воно Вам не потрібно в даному випадку.
Глянувши на код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php print $language ?>" xml:lang="<?php print $language ?>">
<head profile="http://gmpg.org/xfn/11">
  <title><?php print $head_title ?></title>
  <?php print $head ?>
  <?php print $styles ?>
  <?php print $scripts ?>
  <script type="text/javascript"><?php /* Needed to avoid Flash of Unstyle Content in IE */ ?> </script>
</head>
<body>
<div id="page"><!-- begin page -->
  <div id="header"><!-- begin header -->
    <?php if ($logo) { ?><div id="logo"><a href="<?php print $base_path ?>" title="<?php print $site_name ?>"><img src="<?php print $logo ?>" alt="<?php print $site_name ?>" /></a></div><?php } ?>
    <?php if ($site_name) { ?><h1 class='site-name'><a href="<?php print $base_path ?>" title="<?php print $site_name ?>"><?php print $site_name ?></a></h1><?php } ?>
    <?php if ($site_slogan) { ?><div class='site-slogan'><?php print $site_slogan ?></div><?php } ?>
    <?php print $header ?>
  </div><!-- end header -->
  <?php if (isset($primary_links)) { ?><div id="primary"><?php print theme('primary', $primary_links) ?></div><?php } ?>
  <?php print $search_box ?>
  <div id="content"><!-- begin content -->
    <?php if ($sidebar_right) { ?><div id="main"><!-- begin main --><?php } ?>
      <?php if ($mission) { ?>
        <div id="mission">
          <h2 class="title"><?php print t('Mission') ?></h2>
          <div class="content"><?php print $mission ?></div>
        </div>
      <?php } ?>
      <?php print $breadcrumb ?>
      <?php if ($title) { ?><h1 class="title"><?php print $title ?></h1><?php } ?>
      <div class="tabs"><?php print $tabs ?></div>
      <?php print $help ?>
      <?php print $messages ?>
      <?php print $content; ?>
    <?php if ($sidebar_right) { ?></div><!-- end main --><?php } ?>
    <?php if ($sidebar_right) { ?>
      <div id="sidebar-right"><!-- begin sidebar-right -->
        <?php print $sidebar_right ?>
      </div><!-- end sidebar-right -->
    <?php } ?>
  </div><!-- end content -->
  <div id="footer"><!-- start footer -->
    <?php print $footer_message ?>
  </div><!-- end footer -->
</div><!-- end page -->
<?php print $closure ?>
</body>
</html>

можна володіючи HTML і не володіючи PHP побачити структуру документа, описану на сайті вебконсорціуму.

В принципі для пересічного блогера, який не володіє технічними аспектами достатньо буде вказати коректно в усіх тегах, що вписані тут параметр lang="uk" і все буде коректно. Інша справа, якщо вебсайт у Вас кількамовний - тоді варто використовувати елемент ThemeAPI

lang="<?php print $language ?>"

який автоматом буде підставляти мову, вказану Вами в самому ядрі. Важливо дописати такі параметри до всіх блоків, що використовуються у Вас в друпалі на сайті (теги html, title, meta, h1-h6, div, blockquote, span, p тощо - всі вони підтримують параметр мови) - тоді можна бути впевненим, що проблеми пошуковиків можна буде підкріпити фактом із коду з Вашого вебсайту. Повна версія переробленого шаблону з мого вебсайту

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php print $language ?>" xml:lang="<?php print $language ?>">

<head profile="http://gmpg.org/xfn/11" lang="<?php print $language ?>">
  <title lang="<?php print $language ?>"><?php print $head_title ?></title>
  <?php print $head ?>
<meta http-equiv="Content-Language" content="uk" lang="<?php print $language ?>" />
  <?php print $styles ?>
  <?php print $scripts ?>
  <script type="text/javascript" lang="<?php print $language ?>"><?php /* Needed to avoid Flash of Unstyle Content in IE */ ?> </script>
</head>

<body lang="<?php print $language ?>">
<div id="page" lang="<?php print $language ?>"><!-- begin page -->
  <div id="header" lang="<?php print $language ?>"><!-- begin header -->
    <?php if ($logo) { ?><div id="logo" lang="<?php print $language ?>"><a href="<?php print $base_path ?>" title="<?php print $site_name ?>"><img src="<?php print $logo ?>" alt="<?php print $site_name ?>" /></a></div><?php } ?>
    <?php if ($site_name) { ?><h1 class='site-name' lang="<?php print $language ?>"><a href="<?php print $base_path ?>" title="<?php print $site_name ?>"><?php print $site_name ?></a></h1><?php } ?>
    <?php if ($site_slogan) { ?><div lang="<?php print $language ?>" class='site-slogan'><?php print $site_slogan ?></div><?php } ?>
    <?php print $header ?>
  </div><!-- end header -->
  <?php if (isset($primary_links)) { ?><div lang="<?php print $language ?>" id="primary"><?php print theme('primary', $primary_links) ?></div><?php } ?>
  <?php print $search_box ?>
  <div id="content" lang="<?php print $language ?>"><!-- begin content -->
    <?php if ($sidebar_right) { ?><div id="main"><!-- begin main --><?php } ?>
      <?php if ($mission) { ?>
        <div id="mission" lang="<?php print $language ?>">
          <h2 class="title" lang="<?php print $language ?>"><?php print t('Mission') ?></h2>
          <div class="content" lang="<?php print $language ?>"><?php print $mission ?></div>
        </div>
      <?php } ?>
      <?php print $breadcrumb ?>
      <?php if ($title) { ?><h1 class="title"><?php print $title ?></h1><?php } ?>
      <div class="tabs" lang="<?php print $language ?>"><?php print $tabs ?></div>
      <?php print $help ?>
      <?php print $messages ?>
      <?php print $content; ?>
    <?php if ($sidebar_right) { ?></div><!-- end main --><?php } ?>
    <?php if ($sidebar_right) { ?>
      <div id="sidebar-right" lang="<?php print $language ?>"><!-- begin sidebar-right -->
        <?php print $sidebar_right ?>
      </div><!-- end sidebar-right -->
    <?php } ?>
  </div><!-- end content -->
  <div id="footer" lang="<?php print $language ?>"><!-- start footer -->
    <?php print $footer_message ?>
  </div><!-- end footer -->
</div><!-- end page -->
<?php print $closure ?>
</body>
</html>

Після вказування всім блокам параметру мови - можете приступати до індексації вебсайту в пошукових системах.

В принципі на цьому можна закінчити - але є ще один елемент - всі ваші стрічки RSS ( XML ) також потребують вказування мови. Тут Вам допоможе модуль teaser, будь-який текст в ньому заключайте в блок div із вказуванням параметру lang. Цей заголовок - коротка аннотація до кожної статті, в повному html буде включено в стрічку RSS, що в майбутньому додасть рейтингу в пошукових системах в контексті мови Ваших документів. Приклад

<div lang="uk">Стаття про локалізацію для двигунців drupal, wordpress, typo3, reloadcms</div>

В принципі локалізація коду Вашого сайту для системи друпал завершена. Все інше - справа за Вами, можете також використовувати ці знання при генерації статей, посиланнях на зовнішні вебсайти ( параметр hreflang="uk" ) тощо. Все це заставить пошукові системи поважати коректність стандарту та зменьшить пошуковий спам.

Наступний двигунець - Wordpess.

Ця програма дуже популярна серед блогерів всього світу, але це нічого не значить - проблеми в ній також присутні.

Ситуація з ним аналогічна до друпалу. В стандартній темі в файлі /wp-content/themes/default/header.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />
<title><?php bloginfo('name'); ?> <?php if ( is_single() ) { ?> &raquo; Blog Archive <?php } ?> <?php wp_title(); ?></title>
<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats -->
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
<link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss2_url'); ?>" />
<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />
<style type="text/css" media="screen">
<?php// Checks to see whether it needs a sidebar or not
if ( !$withcomments && !is_single() ) {
?>
    #page { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbg-<?php bloginfo('text_direction'); ?>.jpg") repeat-y top; border: none; }
<?php } else { // No sidebar ?>
    #page { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbgwide.jpg") repeat-y top; border: none; }
<?php } ?>
</style><?php wp_head(); ?>
</head>
<body>
<div id="page">
<div id="header">
    <div id="headerimg">
        <h1><a href="<?php echo get_option('home'); ?>/"><?php bloginfo('name'); ?></a></h1>
        <div class="description"><?php bloginfo('description'); ?></div>
    </div>
</div>
<hr />

Згідно документації по темам для Вордпресу - розробники зробили все можливе для багатомовності http://codex.wordpress.org/Blog_Design_and_Layout і особливих питань після прочитаного в Вас не повинно виникнути.

Отже - перероблений варіант стандартної теми вордпреса

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
<head profile="http://gmpg.org/xfn/11" <?php language_attributes(); ?>><meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />
<title <?php language_attributes(); ?>><?php bloginfo('name'); ?> <?php if ( is_single() ) { ?> &raquo; Blog Archive <?php } ?> <?php wp_title(); ?></title>
<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats -->
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
<link rel="alternate" <?php language_attributes(); ?> type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss2_url'); ?>" />
<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />
<style type="text/css" media="screen">
<?php // Checks to see whether it needs a sidebar or not
if ( !$withcomments && !is_single() ) {
?>    #page { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbg-<?php bloginfo('text_direction'); ?>.jpg") repeat-y top; border: none; }
<?php } else { // No sidebar ?>
    #page { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbgwide.jpg") repeat-y top; border: none; }
<?php } ?>
</style><?php wp_head(); ?>
</head>
<body <?php language_attributes(); ?>>
<div id="page" <?php language_attributes(); ?>>
<div id="header" <?php language_attributes(); ?>>
    <div id="headerimg" <?php language_attributes(); ?>>
        <h1 <?php language_attributes(); ?>><a href="<?php echo get_option('home'); ?>/"><?php bloginfo('name'); ?></a></h1>
        <div class="description" <?php language_attributes(); ?>><?php bloginfo('description'); ?></div>
    </div>
</div>
<hr />

Завжди перевіряйте згенерований HTML після внесення Ваших правок - відсутність коду php та правильність відображення сформованих параметрів lang="uk" - обов'язкова!

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

/wp-content/themes/default/archive.php

Показувати як він виглядає до - не буду. Просто підкажу що робити з цим і всіма наступними файлами з теми default.

<?php get_header(); ?>
    <div id="content" class="narrowcolumn" <?php language_attributes(); ?>>
<?php is_tag(); ?>
        <?php if (have_posts()) : ?>
       <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
       <?php /* If this is a category archive */ if (is_category()) { ?>
        <h2 class="pagetitle" <?php language_attributes(); ?>>Archive for the &#8216;<?php single_cat_title(); ?>&#8217; Category</h2>
       <?php /* If this is a tag archive */ } elseif( is_tag() ) { ?>
        <h2 class="pagetitle" <?php language_attributes(); ?>>Posts Tagged &#8216;<?php single_tag_title(); ?>&#8217;</h2>
       <?php /* If this is a daily archive */ } elseif (is_day()) { ?>
        <h2 class="pagetitle" <?php language_attributes(); ?>>Archive for <?php the_time('F jS, Y'); ?></h2>
       <?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
        <h2 class="pagetitle" <?php language_attributes(); ?>>Archive for <?php the_time('F, Y'); ?></h2>
       <?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
        <h2 class="pagetitle" <?php language_attributes(); ?>>Archive for <?php the_time('Y'); ?></h2>
      <?php /* If this is an author archive */ } elseif (is_author()) { ?>
        <h2 class="pagetitle" <?php language_attributes(); ?>>Author Archive</h2>
       <?php /* If this is a paged archive */ } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?>
        <h2 class="pagetitle" <?php language_attributes(); ?>>Blog Archives</h2>
       <?php } ?>
        <div class="navigation" <?php language_attributes(); ?>>
            <div class="alignleft" <?php language_attributes(); ?>><?php next_posts_link('&laquo; Older Entries') ?></div>
            <div class="alignright" <?php language_attributes(); ?>><?php previous_posts_link('Newer Entries &raquo;') ?></div>
        </div>
        <?php while (have_posts()) : the_post(); ?>
        <div class="post" <?php language_attributes(); ?>>
                <h3 id="post-<?php the_ID(); ?>" <?php language_attributes(); ?>><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>
                <small><?php the_time('l, F jS, Y') ?></small>
                <div class="entry" <?php language_attributes(); ?>>
                    <?php the_content() ?>
                </div>
                <p class="postmetadata" <?php language_attributes(); ?>><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
            </div>
        <?php endwhile; ?>
        <div class="navigation" <?php language_attributes(); ?>>
            <div class="alignleft" <?php language_attributes(); ?>><?php next_posts_link('&laquo; Older Entries') ?></div>
            <div class="alignright" <?php language_attributes(); ?>><?php previous_posts_link('Newer Entries &raquo;') ?></div>
        </div><?php else : ?>
        <h2 class="center" <?php language_attributes(); ?>>Not Found</h2>
        <?php include (TEMPLATEPATH . '/searchform.php'); ?>
    <?php endif; ?>
    </div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Згідно документації по створенню тем для вордпреса розробник може змінити структуру файлів в самій темі, тому у Вашому конкретному випадку можливі інші файли, але суть локалізації - незмінна.

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

XML в WordPress українською мовою

Маленький додаток до вордпреса - експорт в рсс. Мабуть розробники не рахують його важливим, тому по замовчуванню внесли значення для всього xml - en

Я впевнений, що жодних проблем із визначенням мови для англійських сторінок не присутньо в випадку Вордпреса. В нашому ж випадку, та й у випадку будь-якої не en мови варто вказати більш коректніше

/wp-admin/includes/schema.php

В даному файлі знаходим стрічку із текстом (в моєму випадку 209 )

add_option('rss_language', 'en');

І міняємо її на коректний варіант, а саме у випадку української мови

add_option('rss_language', 'uk);

Якщо постаратись - можна пов'язати між собою виведення $language та rss_language - це я залишу за Вами

 

Наступна оболонка для керування сайтом - typo3

Даний продукт важко назвати простим, хоча НМД - це справа звички.

Офіцийний документ про локалізацію досить глибоко описує питання багатомовності - не бачу змісту його дублювати

Про цей продукт я напишу найменше - в саму систему вбудовано дуже потужний механізм ведення багатомовних вебсайтів, головне не забувати користувачам даного продукту вносити параметри мови та локалі і перевіряти наявність цих внесень в генерованому коді.

Ключовим механізмом локалізації - є подубова одразу коректного шаблону.

Крім того гляньте в /typo3_src+dummy-4.1.5/typo3/sysext/lang/lang.php

в цьому файлі наведено приклад формування локалі під іменем default

Зустрічав вебсайти українською мовою, XML код яких також прописував <language>en<language>, що свідчить, що автори сайту не дуже піклуються про коректність вказування мови. А може їм і не потрібно?

Іншим, доволі різко відмінним від попередніх продуктів, але насправді потужним двигунцем для ведення блогів і не тільки, є reloadcms. Він базується на текстовому варіанті збереження інформації без допомоги баз даних.

Програма написана Українцями, тому питання локалізації стоїть не так гостро. Тобто воно стоїть, але одразу вирішено коректно у всіх аспектах.

При виборі користувачем української мови - в заголовки одразу прописуються параметри мови lang="uk"

Аналогічна ситуація і з XML - тег <language>uk</language> присутній в стрічках, згенерованих релоадом.

Для остаточного поблочного вказування мови - при генерації сторінок можете весь текст тіла та скорочені аннотації до статей вносити в оболонку блока div

<div lang="uk">Коротка аннотація до статті, сформованої з допомогою reloadcms</div>

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

<div lang="ru-UA">Пример использования русского языка совместно с украинской локализацией</div>

Таке позначення мов стосується всіх варіантів багатомовних документів. Корисно вказувати мову цитат ( blockquote ), скорочень та синонімів ( acronym, span, abbr  ) тощо. Така коректність буде серйозно допомагати парсеру пошукового сервісу або іншого, контент залежного програмного забезпечення, за умови, якщо воно підтримує багатомовність.

Дякую HIP-у за підказаний новий продукт українського виробництва http://www.litediary.com/

Проаналізував його сорці і побачив, що локалізація зроблена не зовсім коректно.

Першим елементом, що характеризує даний продукт - вебсайт розробника, що імовірно написаний на цьому самому продукті. В сорцях його дуже коректно вказані всі стандарти, але НМД - лише як дань моді.

Людина, зайшовши на сторінку, прочитає все коректно, бо Наш, вбудований аналізатор розпізнає українську мову. Робот - точно ні.

Чому? Ось сорці

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head profile="http://gmpg.org/xfn/11">
<script src='http://www.litediary.com/sources/lib_js/common.js' type='text/javascript'></script>
<script type='text/javascript'>url = 'http://www.litediary.com/';</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>
Головна @ LiteDiary &raquo; ...dive into blogging world... - LiteDiary</title>
<meta http-equiv="Pragma" content="no-cache" />
<meta name="generator" content="[LP]BS Plus" />
<meta name="distribution" content="global" />
<meta name="robots" content="follow, all" />
<link href="http://www.litediary.com/sources/styles/serenity/themes/lpbasic/stylesheet.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="http://www.litediary.com/favicon.ico" />
<link rel="alternate" type="application/rss+xml" title="LiteDiary RSS Feed" href="http://www.litediary.com/feed/" />
</head>
<body>
<div id="wall" style="position:fixed; width:100%; height:100%; z-index:99; border:none; display:none; opacity: .6; filter: alpha(opacity=60); margin:0px; padding:0px; left:0px; top:0px; cursor:progress;"></div>
<div id="pages">
<h1><a href="http://www.litediary.com/" title="LiteDiary :: Головна" onclick="getcontent('act=index');return false;">LiteDiary</a></h1>

А також наведу частину сорців стрічки XML , що генерується даним програмним ядром

<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="[LP]BS Plus 0.1.7 Alpha [Build 113]" -->
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
>
<channel>
<title>LiteDiary</title>
<link>http://www.litediary.com/</link>
<description>...dive into blogging world...</description>
<pubDate>Fri, 11 Jan 2008 02:57:00 +200</pubDate>

<generator>http://www.litediary.com/</generator>
<language>en</language>
<item>
<title>Ласкаво просимо на LiteDiary!</title>
<link>http://www.litediary.com/!posts/2</link>
<pubDate>Fri, 11 Jan 2008 02:57:00 +200</pubDate>
<dc:creator>Admin</dc:creator>
<category><![CDATA[All]]></category>
<guid isPermaLink="false"></guid>
<description><![CDATA[<p><img src="http://www.litediary.com/litediary.gif" alt="Logo" /></p>
<p>Ймовірно, вас зацікавлять розділи:</p>

В HTML не вказано мови, якою сформовано документ, а в XML вказано! Але чітко - англійська. Будь-який робот буде абсолютно правий, якщо співставить даному домену англійську мову, а в кращому варіанті - російську.

 

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

Першочергово коректуємо стиль (в сорцях був лише стиль Serenity, тому буду коректувати його) /B107/sources/styles/serenity/tmpl/header.lph.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="uk" xml:lang="uk">
<head profile="http://gmpg.org/xfn/11" lang="uk">
<script src='<?=W?>sources/lib_js/common.js' type='text/javascript'></script>
<script type='text/javascript'>url = '<?=W?>';</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title lang="uk"><?=TITLE?></title>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Content-Language" content="uk" lang="uk" />
<meta name="generator" content="[LP]BS <?=$P['type']?>" />
<meta name="distribution" content="global" />
<meta name="robots" content="follow, all" />
<link href="<?=ST2?>stylesheet.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="http://www.litediary.com/favicon.ico" />
<link rel="alternate" type="application/rss+xml" title="<?=$TEXT['blog_title']?> RSS Feed" href="<?=W?>feed/" />
</head>
<body lang="uk">
<div lang="uk" id="wall" style="position:fixed; width:100%; height:100%; z-index:99; background-color:#fff; layer-background-color:#fff; border:none; display:none; opacity: .6; filter: alpha(opacity=60); margin:0px; padding:0px; left:0px; top:0px; cursor:progress;"></div>
<div id="pages" lang="uk">
<h1 lang="uk"><a href="<?=W?>" title="<?=$TEXT['blog_title']?> :: <?=$L['home']?>" onclick="getcontent('act=index');return false;"><?=$TEXT['blog_title']?></a></h1>
</div>
<div id="wrap" lang="uk">
<div id="logo" lang="uk">
</div>
<div id='general' lang="uk"><div id='content' lang="uk">

Всі внесені правки виділено жирним текстом. Крім цього в стилі присутні також елементи, що відповідають за генерацію інших частин двигунця - додавання локалі до них залишаю Вам як домашнє завдання 8))).

Наступний крок - зміна локалі в XML - як виявилось, продукт ще дійсно в форматі альфи, бо саму мову не винесено в винляді змінної ядра, вона залишилась як банальний текст в самому генераторі rss та atom стрічок.

Отже правимо /B107/sources/lib/feed/rss2.php

Знаходим en та змінюємо на потрібне Вам значення.

 

<? $POSTS=archiveposts(0,$NUM['posts_in_feed']);?>
<?='<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="[LP]BS '.$P['type'].' '.$version.'" -->
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    >'?>
<channel>
    <title><?=$TEXT['blog_title']?></title>
    <link><?=W?></link><description><?=$TEXT['blog_description']?></description>
    <pubDate>Mon, 23 Jul 2007 19:32:07 +0000</pubDate>
    <generator><?=W?></generator>
    <language>uk</language> 

Локалізацію Atom1.0 документа залишу на плечі самих розробників - там по суті також нескладно.

 

 

Задумався над написанням висновка.

 

По суті - писати нічого. Раджу дотримуватись стандартів.

Чому?

Все просто! Під час індексування робот буде обробляти такі сторінки коректно. У разі ж помилок - буде хоча-б доказ того, що помилка в парсері робота, а не на Вашому вебсайті, яка допоможе розв'язати проблему та заставить розробників роботів та інших програм поправити помилку.

Успіху!

Далі буде...

Trackback URL для цього допису

http://itua.name/uk/trackback/88
Share this

Об'єднати вміст Об'єднати вміст

Propeople Expert

Партнери

експерименти

Rambler's Top100