Готовая локализация без БД (4.7)

Автор: jason32 - 25.09/2006, пн - 21:10

Итак, сделал я локализацию без базы. Сделано немного - запросы к базе ещё остались, но их стало порядка 10-20 против 200-400 ранее. Пока изменена лишь одна функция + сделан конвертер из базы. У меня всё прекрасно сработало.
Итак - файл common.inc

Было:

  1. <?php
  2. function t($string, $args = 0) {
  3.   global $locale;
  4.   if (function_exists('locale') && $locale != 'en') {
  5.     $string = locale($string);
  6.   }
  7.   if (!$args) {
  8.     return $string;
  9.   }
  10.   else {
  11.     return strtr($string, $args);
  12.   }
  13. }
  14. ?>

Стало:

  1. <?php
  2. function t($string, $args = 0) {
  3.   global $locale;
  4.   global $lang;
  5.   if (isset($lang[$string])) $string=stripslashes($lang[$string]);
  6.   elseif (isset($lang[addslashes($string)])) $string=stripslashes($lang[addslashes($string)]);
  7.   else
  8.   if (function_exists('locale') && $locale != 'en') {
  9.     $string = locale($string);
  10.   }
  11.   if (!$args) {
  12.     return $string;
  13.   }
  14.   else {
  15.     return strtr($string, $args);
  16.   }
  17. }
  18. ?>

+ converter.php

  1. <?php
  2. // converter.php
  3. require_once './includes/bootstrap.inc';
  4. drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
  5. //////////названия таблиц////////////////////////////
  6.   $table_meta='locales_meta';
  7.   $table_sources='locales_source';
  8.   $table_target='locales_target';
  9. ////////////////////////////////////
  10.   $lang=array();
  11.   $lang_en=array();
  12.   $sql="Select  * from $table_meta where `isdefault`=1";
  13.   $res=mysql_query($sql) or die(mysql_error());
  14.   if ($row=mysql_fetch_array($res))
  15.   {
  16.   $is_default=$row['locale'];
  17.   }
  18.   else die('Нет значения по умолчанию');
  19.   $sql="Select `lid`,`source` from $table_sources ";
  20.   $res=mysql_query($sql) or die(mysql_error());
  21.   while ($row=mysql_fetch_array($res))
  22.   {
  23.   $lang_en[$row['lid']]=$row['source'];
  24.   }
  25.   $sql="Select `lid`,`translation`,`locale` from $table_target where `locale`=\"$is_default\"";
  26.   $res=mysql_query($sql) or die('  '.mysql_error());
  27.   while ($row=mysql_fetch_array($res))
  28.   {
  29.     $id=addslashes($lang_en[$row['lid']]);
  30.     if (!empty($row['translation']))
  31.     {
  32.   $locale_id=addslashes($row['translation']);
  33.     $lang[$id]=$locale_id;
  34.     }
  35.     else $lang[$id]=$id;
  36.   }
  37.   $locale_file="<?
  38.    ";
  39.   foreach ($lang as $sources=> $target)
  40.   {
  41.   $locale_file.='$lang[\''.$sources.'\']=\''.$target."';
  42.  ";
  43.   }
  44.   $locale_file.='?>';
  45.   if (!is_dir('locale')) mkdir('locale',0755);
  46.   $fp=fopen('locale/russian.php','w');
  47.   fwrite($fp,$locale_file);
  48.   fclose($fp);
  49. ?>

Необходимые условия:
нужно закинуть файл conveter.php в корень. Если папка locale с файлом russian.php не появилась - значит необходимо вручную её создать.
В index.php первым оператором прописать include('locale/russian.php');
и всё должно заработать.
После этого запускаем converter.php и тестим
После инсталяции очередного перевода модуля нужно будет только запустить Конвертер и всё.

Комментарии

а можно подробнее про файл russian.php в папке locale? его нужно самому создавать или достаточно создать папку locale в корне движка, а russian.php будет создан конвертером?

если нет, то что должно быть в файле russian.php?

"Если папка locale с файлом russian.php не появилась - значит необходимо вручную её создать."

файл скрипт создаёт сам, но если не создаст, то это можно сделать самому... да и проверьте сами, это просто, он не должен быть пустым...

Отличный хак =) Спасибо! Я пробовал на пятерке, немного подкорректировал код. все работает на ура. визуально все сталорабоать быстрее =)
Вот только сразу родилося вопрос: а как быть если сайт мультиязычный?