WackoWiki: НпЖ/Языки ...

Home Page | Изменения | Новые Комменты | Пользователи | Каталог | Регистрация | Вход:  Пароль:  

Удовлетворительная поддержка многоязычности достижима.


Способ достижения (в применении к приложению /Wacko Wiki):

  1. вводится сущность (класс) Language.
  2. у каждого Language есть следующие свойства:
    1. Имя (по-английски).
    2. messageset
    3. charset
    4. locale
      • набор локалей. PHP сам выберет первую работоспособную.
    5. таблицы перекодировки в/из Unicode (2 шт.)
    6. таблицы lower, upper и alphanumeric символов
    7. таблицы транслитизации
      • если он не стоит, то NpjTranslit всего-то lowercas'ит.
    8. базовый регексп поиска ВикиИмени
      • в первом варианте реализации обойдёмся без него.

Варианты реализации:

  1. Вариант 1. Язык страницы хранится в БД (берётся, очевидно, язык создателя страницы; в свойствах страницы язык можно сменить).
    • При выводе страницы, контент которой на языке A, юзеру с языком Б, чарсет ставится для языка А, контент выводится as is, а вся обвязка (messageset) конвертируется в уникоде-энтитиз.
  2. Вариант 1a.
    • При выводе страницы, контент которой на языке A, юзеру с языком Б, чарсет ставится для языка Б, вся обвязка (messageset)выводится as is, а контент конвертируется в уникоде-энтитиз.
  3. Вариант 2. Для вывода страницы всегда используется charset посетителя. Подразумевается, что билингвы сосут или переключают чарсет вручную.

Проект /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, максимум х1017.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
* Support for multi-byte charsets.

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
mellonkludge – это значит примерно "уродливый хак"
:)
17.10.2003 21:57:39
Роман Иванов

ага. я знаю, что уродливый, и что хак.


но это единственный способ добиться хоть какой-то многоязычности в обозримое время.

17.10.2003 21:58:16
Роман Ивановнет другого способа, к сожалению =(17.10.2003 21:58:26


YuliaShabunio Я думаю, что на уникод в конце концов перейдут все ( и это правильно ). Но сейчас удобнее пользоваться кодировками – слишком много унаследованного кода, да и размер пока имеет значение. Было бы здорово включить utf-8 как один из языков, чтобы переход на него в последствии оказался менее болезненным.

Пример описания языка:

<?
$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(
   
"А"=>"&#192;""Б"=>"&#193;""В"=>"&#194;""Г"=>"&#195;""Д"=>"&#196;""Е"=>"&#197;""Ж"=>"&#198;",
   
"З"=>"&#199;""И"=>"&#200;""Й"=>"&#201;""К"=>"&#202;""Л"=>"&#203;""М"=>"&#204;""Н"=>"&#205;",
   
"О"=>"&#206;""П"=>"&#207;""Р"=>"&#208;""С"=>"&#209;""Т"=>"&#210;""У"=>"&#211;""Ф"=>"&#212;",
   
"Х"=>"&#213;""Ц"=>"&#214;""Щ"=>"&#217;""Ъ"=>"&#218;""Ы"=>"&#219;""Ь"=>"&#220;""Э"=>"&#221;",
   
"Ю"=>"&#222;""Я"=>"&#223;""а"=>"&#224;""б"=>"&#225;""в"=>"&#226;""г"=>"&#227;""д"=>"&#228;",
   
"е"=>"&#229;""ж"=>"&#230;""з"=>"&#231;""и"=>"&#232;""й"=>"&#233;""к"=>"&#234;""л"=>"&#235;",
   
"м"=>"&#236;""н"=>"&#237;""о"=>"&#238;""п"=>"&#239;""р"=>"&#240;""с"=>"&#241;""т"=>"&#242;",
   
"у"=>"&#243;""ф"=>"&#244;""х"=>"&#245;""ц"=>"&#246;""щ"=>"&#249;""ъ"=>"&#250;""ы"=>"&#251;",
   
"ь"=>"&#252;""э"=>"&#253;""ю"=>"&#254;""я"=>"&#255;",
  ),
  
);
?>


-> Antispam


 
Файлов нет. [Показать файлы/форму]
Donate
Время работы: 0.992 s
Использовано памяти: 2.806 Mb