Удовлетворительная поддержка многоязычности достижима.
Способ достижения (в применении к приложению /Wacko Wiki):
Варианты реализации:
Проект /Wacko Wiki будет реализовывать вариант 1.
| Urbansheep | А что делать со всякими длинными тире, кавычками и прочим? Аргумент основной – на каждую букву, как я вижу, получается железно пять байт, вместо ютф-овского кодирования, где обычно от одного и больше (для русских букв – обычно два) байта. | 17.10.2003 16:31:53 |
| Urbansheep | Кроме того, с уникодом о кодовой странице думать вообще не нужно, то есть, всё будет попроще... | 17.10.2003 16:33:41 |
| Роман Иванов | >> А что делать со всякими длинными тире, кавычками и прочим? Не понял вопроса. А в чём с ними проблема? >> Аргумент основной – на каждую букву, как я вижу, получается железно пять байт, вместо ютф-овского кодирования, где обычно от одного и больше (для русских букв – обычно два) байта. Так-то оно так. Но ты то ли не учитываешь, то ли не понял, что контент страницы всегда будет однобайтовым, а пяти-шестибайтовым только ссылки на страницы с другим языком и мессаджсеты, если у юзера другой язык. | 17.10.2003 16:33:49 |
| Роман Иванов | >> Кроме того, с уникодом о кодовой странице думать вообще не нужно, то есть, всё будет попроще... Это delusion. Транслит и alpha/lower/upper уникодом не обеспечивается, так что о языке всё равно придётся заботиться | 17.10.2003 16:34:42 |
| Роман Иванов | Кроме того, хранение в уникоде раздует хранилище минимум x2, максимум х10 | 17.10.2003 16:35:08 |
| Роман Иванов | Для оверсайтваки с 60Mb хранилища x10 было бы весьма неприятно | 17.10.2003 16:35:44 |
| Urbansheep | М... не спорю... Но получается как-то чересчур замороченно... И билингвал-Non-Western-контент (русско-китайский, например) тоже оказывается в пролёте... Транслит/альфа можно подключать как модули, которые желающие могут заточить под свой язык (в иврите, насколько я помню, различия между заглавными и строчными вообще нет, также, как и в иероглифических системах (интересно было бы посмотреть на CamelCaseHieroglyph)), если им не хватает русского или латинского алфавитов. | 17.10.2003 16:41:49 |
| Роман Иванов | Ну и проблема FTS важна. В mysql 3.x FTS по UTF не бывает совершенно точно. Переделывать поисковые механизмы сейчас у нас возможности (читай, времени) нет. | 17.10.2003 16:42:14 |
| Urbansheep | Выходит, что остаётся ждать БД с компрессией таблиц и нативным юникодом, плюс более человеческая поддержка юникода в пхп. | 17.10.2003 16:42:42 |
| Urbansheep | Ну да. | 17.10.2003 16:42:44 |
| Роман Иванов | >> М... не спорю... Но получается как-то чересчур замороченно... И билингвал-Non-Western-контент (русско-китайский, например) тоже оказывается в пролёте... Билингвал-контент в пролёте – это главный tradeoff этого решения. >> Транслит/альфа можно подключать как модули, которые желающие могут заточить под свой язык Ни-ни. Транслит для любого известного системе языка нужен. Ибо supertag и вообще clean URLs. | 17.10.2003 16:43:38 |
| Urbansheep | Ну и как ты хочешь сделать транслит для корейского, скажем? | 17.10.2003 16:45:12 |
| Роман Иванов | Я вообще пока мультибайты не планирую поддерживать. Корейский же иероглифический? | 17.10.2003 16:45:39 |
| Urbansheep | Угу. Они все почти double-byte. | 17.10.2003 16:45:59 |
| mellon | почему нет поиска в UTF? есть. берёшь и ищещь UTF-encoded слово. м.б. какие-то wildcards не работают, это да, не знаю. | 17.10.2003 18:06:51 |
| Роман Иванов | в 3.x? | 17.10.2003 21:01:49 |
| Роман Иванов | я проверил. не ищет. | 17.10.2003 21:32:37 |
| Роман Иванов | могу показать тестовый скрипт | 17.10.2003 21:33:30 |
| Роман Иванов | косвенное доказательство: http://www.mysql.com/doc/en/Fulltext_TODO.html 6.8.3 Full-text Search TODO | 17.10.2003 21:35:52 |
| mellon | но если ты записываешь utf-8 как чистый 8битный текст и потом ищещь 8битные слова то MySQL не должен и знать ничего о том, какая это кодировка | 17.10.2003 21:45:37 |
| Роман Иванов | да, но ему и вголову не может придти, что символ с кодом, скажем x01 – часть "слова", а не разделитель | 17.10.2003 21:46:21 |
| mellon | а там 0x01 не бывает | 17.10.2003 21:53:17 |
| mellon | там бывает 0x20–0xff, все "честные символы" | 17.10.2003 21:53:31 |
| mellon | либо 0x20–0x7f – ascii либо дополнительные байты utf-8, у которых всегда восьмой бит включен | 17.10.2003 21:53:56 |
| Роман Иванов | Толя, ну ты вот утверждаешь на опыте или нет? Я только что попробовал поискать слово "люблю" в UTF-8. | 17.10.2003 21:54:14 |
| Роман Иванов | Она его не находит. | 17.10.2003 21:54:23 |
| mellon | нет, не на опыте ;) | 17.10.2003 21:54:32 |
| Роман Иванов | сорри, "любит" | 17.10.2003 21:54:35 |
| Роман Иванов | вот это я в UTF-8 вставил в БД и поискал "любит" $strings = array("мама мыла раму", "козлик любит маму", "жопа любит петю", "петя сосёт у маши", "все сосут нахер", "любит или не любит", "мама или петя", "отчетность", "любит", ""); | 17.10.2003 21:55:09 |
| mellon | просто, извини, но твоя схема – ужасный kludge просто очень через задницу ну 2003-й год уже в начале 2002-го я понимаю, мы рисковали, когда жж на юникод переводили. ещё было мало сайтов полностью на юникоде. сейчас уже другое время. | 17.10.2003 21:56:02 |
| Роман Иванов | я не знаю слова kludge =) ну 2003-й. Но вы делаете под выделенный сервер, а я под максимальный охват по хостерам. У хостеров стоит mysql 3.x и php без поддержки mb*-функций | 17.10.2003 21:57:06 |
| Роман Иванов | А писать свой FTS у меня нет сейчас времени. | 17.10.2003 21:57:23 |
| mellon | kludge – это значит примерно "уродливый хак" :) | 17.10.2003 21:57:39 |
| Роман Иванов | ага. я знаю, что уродливый, и что хак. но это единственный способ добиться хоть какой-то многоязычности в обозримое время. | 17.10.2003 21:58:16 |
| Роман Иванов | нет другого способа, к сожалению =( | 17.10.2003 21:58:26 |
Пример описания языка:
<?
$wackoLanguage = array(
"name" => "German",
"code" => "de",
"charset" => "iso-8859-1",
"utfdecode" => array(),
"UPPER_P" => "A-Z\xc0-\xd6\xd8-\xdd",
"LOWER_P" => "a-z\xdf-\xf6\xf8-\xfd\xff\/'",
"ALPHA_P" => "A-Za-z\xc0-\xd6\xd8-\xdd\xdf-\xf6\xf8-\xfd\xff\_\-\/'",
"locale" => "C",
"NpjLettersFrom" => "абвгезийклмноптуфхщъыэАБВГЕЗИЙКЛМНОПТУФХЩЪЫЭ",
"NpjLettersTo" => "aaaaaceeeeiiiioooouuuyAAAAACEEEEIIIIOOOOUUUY",
"NpjBiLetters" => array("д"=>"ae", "с"=>"ny", "ц"=>"oe", "ь"=>"ue", "ж"=>"ae", "Д"=>"Ae", "С"=>"Ny",
"Ц"=>"Oe", "Ь"=>"Ue", "Ж"=>"Ae", "я"=>"yu", "Я"=>"ss", ),
"unicode_entities" => array(
"А"=>"À", "Б"=>"Á", "В"=>"Â", "Г"=>"Ã", "Д"=>"Ä", "Е"=>"Å", "Ж"=>"Æ",
"З"=>"Ç", "И"=>"È", "Й"=>"É", "К"=>"Ê", "Л"=>"Ë", "М"=>"Ì", "Н"=>"Í",
"О"=>"Î", "П"=>"Ï", "Р"=>"Ð", "С"=>"Ñ", "Т"=>"Ò", "У"=>"Ó", "Ф"=>"Ô",
"Х"=>"Õ", "Ц"=>"Ö", "Щ"=>"Ù", "Ъ"=>"Ú", "Ы"=>"Û", "Ь"=>"Ü", "Э"=>"Ý",
"Ю"=>"Þ", "Я"=>"ß", "а"=>"à", "б"=>"á", "в"=>"â", "г"=>"ã", "д"=>"ä",
"е"=>"å", "ж"=>"æ", "з"=>"ç", "и"=>"è", "й"=>"é", "к"=>"ê", "л"=>"ë",
"м"=>"ì", "н"=>"í", "о"=>"î", "п"=>"ï", "р"=>"ð", "с"=>"ñ", "т"=>"ò",
"у"=>"ó", "ф"=>"ô", "х"=>"õ", "ц"=>"ö", "щ"=>"ù", "ъ"=>"ú", "ы"=>"û",
"ь"=>"ü", "э"=>"ý", "ю"=>"þ", "я"=>"ÿ",
),
);
?>
-> Antispam