многоязычное приложение

kSalex

Новичок
многоязычное приложение

Решил разработать многоязычное приложение.
Перечитал многие статьи и решил ни писать всю статику в массивы для каждого языка или файлы или конфиги смарти, понравился мне gettext(тем более это как стандарт, можно будет использовать и в др. языках) и всё с ним получается.
Весь динамический контент храню в utf8 (бд mysql 4.1.10)
По умолчанию кодировка mysql-я latin1

Таблицы создавал так:
CREATE TABLE bla(
...
)ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

Насколько я понимаю, все данные которые я буду добавлять в таблицу будут автоматически конвертироваться в utf-8. (хотя из phpmyadmin-a на utf запись не была похожа ÀàÁáÂâ...Ññ...Þþßÿ, это строка 'АаБбВв...Сс...ЮюЯя')
Т.к. по умолчанию стоит latin1, то перед выборкой из БД делаю:
SET NAMES utf8;
В конечом итоге устанавливаю мета-тег charset в utf-8 и отправляю заголовок :
PHP:
header('Content-type: text/html; charset=utf-8');
Вывожу выбранные данные и в браузере получаю крокозюблы.
Почему? В gettext-е(файлах po, mo) все данные в utf-8 и при установке заголовка utf-8 - все русские символы выводит прекрасно. Объясните плиз что не так.

Ещё лучше посмотреть какой-то рабочий пример, именно с gettext-ом и mysql (phpmyadmin - не предлагайте, там на файлах. cms Mambo тоже не надо - там вообще вся статика на константах).
 

alexhemp

Новичок
Я не применяю GetText по нескольким причинам

1. Затруднено управление константными данными
2. Затруднено использование шаблонов в этих строках

В итоге т.к. в основном использую Smarty то проще оказалось написать ресурс-плагин для вывода на текущем языке.
 

kSalex

Новичок
2 alexhemp
Я тоже использую смарти и он мне очень нравиться, раньше делал всё на конфигурационных файлах, т.е.
/conf
site_ru.conf
site_en.conf
....

Решил использовать gettext, т.к для меня это что-то новое и довольно понятное.

Вообще проблема не в этом, а в моей БД, т.к. выводит весь текст кракозяблами. Используя gettext можно написать
ф-ию: bind_textdomain_codeset($domain, 'UTF-8'); послать заголовок и весь русский текст будет выведен нормально.

Пока вот что получается с БД:
При выборке из БД делаю запрос:
$chars =& $dbh->query("SET character_set_client=utf8");
после чего ф-ей iconv перекодирую всё в утф:
print iconv('CP1251', 'UTF-8', $dbh->getOne('SELECT * FROM test'));

Но ведь это не хорошо, каждый раз конвертить тем более если текста будет много. В данном случае я знаю что текст отправляемый в БД в кодировке cp1251, а если это будет китайский как быть с iconv ?
iconv('?', 'UTF-8', $dbh->getOne('SELECT * FROM test'));
какой string in_charset ?

-~{}~ 01.12.05 13:24:

смотрю я никто не хочет мне помочь.
Вообщем после ночного брода по всем возможным форумам ответы для себя нашёл и с радостью расскажу другим. Также сюда относится ответ на вопрос типа: "При выборке из БД проподают некоторые символы, заменяются кракозюблами";
Что у меня:
php 4.4 (php 5.1 b3 - на нём тоже всё работает)
mysql 4.1.10 default latin1
apache 1.3.33
OS: Windows 2003 Server. Под ASPLinux тоже тестил

В чём моя ошибка была? А в том что все скрипты у меня были в кодировке windows-1251. Необходимо обязательно ставить utf-8

В приведенном ниже коде т.к. я решил юзать gettext в базу будет вставляться строка из po файла, который также в кодировке utf8. Использую PEAR Translation2

Собственно код:
PHP:
require_once('Translation2.php');
header("Content-Type: text/html; charset=UTF-8");
$lang = 'ru'; //например русский
$params = array(
	'prefetch'          => false,
	'langs_avail_file'  => $_SERVER['DOCUMENT_ROOT'].'/conf/locale/langs.ini',
	'domains_path_file' => $_SERVER['DOCUMENT_ROOT'].'/conf/locale/domains.ini',
	'default_domain'    => 'menuitems',
	'file_type'         => 'po',
	);
$tr =& Translation2::factory('gettext', $params);
$tr->setLang($lang);
$dbh =& DB::Connect($dsn);
//указываем кодировку скрипта
$res =& $dbh->query("SET NAMES UTF8");
if(PEAR::isError($res)){
    die($res->getMessage());
}
$ins = $dbh->autoExecute('utf', array('bla'=>$tr->get('News')), DB_AUTOQUERY_INSERT);
//$ins = $dbh->autoExecute('utf', array('bla'=>'или что угодно'), DB_AUTOQUERY_INSERT);
if(PEAR::isError($ins)){
    die($ins->getMessage());
}
//возвращаем все данные из БД в utf8
$res =& $dbh->query("SET NAMES UTF8");
if(PEAR::isError($res)){
    die($res->getMessage());
}

$res =& $dbр->query('SELECT * FROM utf');
while ($row =& $res->fetchRow()) {
    echo $row[0] . "<br>\n";
}
База:
PHP:
CREATE DATABASE `utf` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE utf;

CREATE TABLE `utf` (
  `bla` varchar(200) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Можете также посмотреть здесь
 
Сверху