Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Сайт на двух (или более) языках. Как лучше и проще сделать поддержку многоязычности? (Victor Feketa, оценка: 5)
Goto page Previous  1, 2
Author Message
VitCOM web
Guest





Карма: 386
   поощрить/наказать


PostPosted: Wed Jul 25, 2007 11:57 pm (написано за 3 минуты 3 секунды)
   Post subject:
Reply with quote

а я проще далаю, может не совсем корректно
Code (php): скопировать код в буфер обмена
$local['rus']['send'] = "";
а в скрипте вывожу
$lng у меня берется из URL
Code (php): скопировать код в буфер обмена
echo (www.php.net/echo) $local[$lng]['send'];
Back to top
Xploit
Guest





Карма: 386
   поощрить/наказать


PostPosted: Thu Sep 20, 2007 2:44 pm (спустя 1 месяц 25 дней 14 часов 47 минут; написано за 2 минуты 26 секунд)
   Post subject:
Reply with quote

Ramzes wrote:
bmg1 wrote:
А как это меняется?
Не понял сути вопроса... preg_replace_callback`ом при компиляции...
У себя на сайте решил проблему многоязычности именно заменой строк относительно базового языка.
Отдача сайта идет в utf-8, а вот базу уложил в cp1251. Если интересно как welcome.

icq 152526010
Back to top
Guest






Карма: 386
   поощрить/наказать


PostPosted: Tue Oct 16, 2007 11:11 am (спустя 25 дней 20 часов 26 минут; написано за 23 минуты 50 секунд)
   Post subject:
Reply with quote

Еще один вариантик для небольших двуязычных сайтов (например, использующих национальный и английский языки):

подготовительные операции:
-1-
сайт изначально грузится в дефолтной кодировке, при нажатии на кнопочку "нац" или "анг" страничка выполняет переход на ChangeLng.php с параметром ?def или ?alt - в зависимости от выбранного языка.
ChangeLng.php проверяет переданный параметр на значение 'alt' или 'любое, отличное от alt' и задает значение переменной уровня сессии "$lang" в 0 (дефолтный язык) или 1 (альтернативный язык), после чего отправляет браузеру страницу, вызвавшую свое выполнение
-2-
в базе данных добавляется доп.поле Lng(char(1)binary, имеющее значение 0 для дефолтного и 1 для альтернативного языка. Скрипт внесения инфы в БД должен всегда добавлять две записи, отличающиеся языком заполнения полей - при этом, если какие-то поля на одном из языков не заполнены - данные в них должны копироваться из второго языка

в коде шаблона:
-1-
вывод блока кода:
Code (php): скопировать код в буфер обмена
if($lang) {
    /*
  } else {
    /*
  }
-2-
вывод текста:
Code (php): скопировать код в буфер обмена
echo (www.php.net/echo) ($lang)?"альтернативный язык":"дефолтный язык"
-3-
присвоение значения переменной:
Code (php): скопировать код в буфер обмена
$var=($lang)?"альтернативный язык":"дефолтный язык"
выборка из базы:
в SQL-запрос создается (или дополняется) условие WHERE lng=$lang
Back to top
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 180
   поощрить/наказать

Location: Москва

PostPosted: Thu Nov 29, 2007 6:44 pm (спустя 1 месяц 13 дней 7 часов 33 минуты; написано за 51 секунду)
   Post subject:
Reply with quote

localize: локализация многоязычного текста (forum.dklab.ru/viewtopic.php?t=27853)
Back to top
View user's profile Send private message Send e-mail
NectarIn
Участник форума



Joined: 10 Sep 2007
Posts: 21
Карма: 2
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Tue Feb 26, 2008 11:17 pm (спустя 2 месяца 27 дней 4 часа 33 минуты; написано за 27 минут 38 секунд)
   Post subject:
Reply with quote

Я, может быть, выскажусь резко, но мне кажется, что вот такие решения:
Code (php): скопировать код в буфер обмена
echo (www.php.net/echo) func(' ', 'English text');
Code (php): скопировать код в буфер обмена
echo (www.php.net/echo) ($lang == 'ru'?'Русский текст':'English text');
...и тому подобные - это не решения. Это всё тот же switch, только зачем-то обёрнутый во что-то. Даже для двух фиксированных языков остаются вопросы - если сообщение достаточно велико, мы вынуждены писать фактически два варианта. Чем больше текст - тем глупее будет выглядеть код. И потом, никто и никогда не станет утверждать на 100% процентов, что самый простой сайт с минимальной функциональностью потом не попросит третьего языка, больших текстов и т.п.
Gettext на первый взгляд неплох, но лично у меня есть вопросы. Во-первых, что делать, если тот или иной перевод сообщения приходится менять, причём это будет "основной" перевод - используемый в скриптах? Придётся менять его и в базе gettext и во всех файлах, где это сообщение выводится. И в любом случае остаётся открытым вопрос с большими текстами... В связи с этим у меня есть такое видение верного пути. (Хоть и чувствую себя очередным Лениным на броневике, но надо бы уже высказаться.)
Деление сообщений на общие и уникальные в чем-то верно, но уникальные это лишь частный случай общих. Валить всё в одну кучу бессмысленно, тем более, что есть целых несколько признаков классификации (статические-динамические, большие статьи-мелкие сообщения и так далее). Возникает естественное желание разбить все сообщения по группам и составить иерархию. В этом случае можно было бы обращаться к тем или иным текстам в стиле URI... Что, наверное, только усугубляет проблему поздних изменений переводов, поскольку дерево категорий будет меняться не столь часто, и изменения в нём будут более тяжелыми. Возможно, это реально реализовать в больших динамично развивающихся системах. Мне кажется - нет...
У меня есть предложение использовать одновременно два подхода в поиске нужного текста.
Во-первых, поиск в стиле gettext, то есть на основе фиксированной фразы...
Code (php): скопировать код в буфер обмена
function findtext($text, $lang = '', $back = true)
Пустой параметр $lang заставляет использовать дефолтный язык. Параметр $back разрешает возвращать исходный текст при неудачном поиске. Возможна установка этого параметра в false - чтобы неудачный поиск каким-либо образом сигнализировал программисту о том, что что-то где-то он забыл поменять.
Во-вторых, поиск по идентификатору, знакомый нам по классическим методам работы с языковыми массивами и особенно удобный для вывода больших текстов.
Code (php): скопировать код в буфер обмена
function findid($text, $lang = '', $back = false)
Возможна доработка этих функций в нескольких направлениях: поиск не точной фразы (с последующим переходом на PCRE), установка порядка следования языков в случае неудачного поиска требуемого перевода и т.п.
Вот такое у меня видение проблемы. В любом случае, хочу отметить, что для серьёзных решений нужна и серьёзная платформа... Там, где автору кажется целесообразным использовать "минутные" варианты, указанные в начале поста, возможно, и всё остальное будет сделано на лёгкую руку. И смысл после этого ставить поверх языковые решения, более мощные, чем switch или массивы?.. :)
Back to top
View user's profile Send private message
eternalko
Участник форума



Joined: 06 Jan 2008
Posts: 34
Карма: 0
   поощрить/наказать


PostPosted: Fri Mar 07, 2008 5:52 pm (спустя 9 дней 18 часов 34 минуты; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

Может я и странный, но я бы вынес вынес весь текст, в отдельные файлы и пообзывал его там константами(:
Просто подключается нужный файл и все.

Думаю, объяснять больше нечего...
Back to top
View user's profile Send private message
а-я
Заглянувший



Joined: 23 Dec 2007
Posts: 9
Карма: 0
   поощрить/наказать

Location: Астана (Алматы)

PostPosted: Wed Jun 18, 2008 7:01 am (спустя 3 месяца 10 дней 13 часов 8 минут; написано за 1 минуту 3 секунды)
   Post subject:
Reply with quote

Не знаю насколько это правильно, но я так делаю:
Code (php): скопировать код в буфер обмена
<?
 echo (www.php.net/echo) TEXT('Привет'); // Привет
 
 $land_A = array (www.php.net/array)('Привет'=>'Hello');
 echo (www.php.net/echo) TEXT('Привет'); //  Hello
 
 $land_A = array (www.php.net/array)('Привет'=>'Салем');
 echo (www.php.net/echo) TEXT('Привет'); // Салем


 function TEXT($A)
 {
  global (www.php.net/global) $land_A;
  return empty (www.php.net/empty)($land_A[$A]) ? $A : $land_A[$A];
 }
?>
т.е. все необходимые слова и предложения пропускаем через функцию «TEXT»
И если в заранее созданном массиве есть ключ с этим словом, то его функция заменяет на значение этого ключа. А сам массив хранить кому как удобно, в БД или отдельном файле.
Очень удобно!
Кто что думает об этом?
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Wed Jun 18, 2008 11:05 am (спустя 4 часа 3 минуты; написано за 2 секунды)
   Post subject:
Reply with quote

Вообще, в разных контекстах перевод может быть различным, а строгое закрепление за одним выражением одного перевода может качество локализации снизить.
Back to top
View user's profile Send private message Send e-mail
а-я
Заглянувший



Joined: 23 Dec 2007
Posts: 9
Карма: 0
   поощрить/наказать

Location: Астана (Алматы)

PostPosted: Wed Jun 18, 2008 5:36 pm (спустя 6 часов 31 минуту; написано за 37 секунд)
   Post subject:
Reply with quote

Юрий, Это Вы мне?
в моем варианте. Перевод происходит не с отдельными словами, а сразу с блогом.

например? есть ссылка и описание.

<a href="/"><?=TEXT('Ссылка')?></a> <?=TEXT('Это описание ссылки.')?>

т.е. в моем коде, кириллица по умолчанию.
и если есть массив, в котором есть ключ искомого блога, то функция заменит на значение.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Thu Jun 19, 2008 12:49 am (спустя 7 часов 13 минут; написано за 2 секунды)
   Post subject:
Reply with quote

Ну вот у Вас слово "Ссылка". Если бы Вы использовали свой метод с изначальными названиями на английском, то слову "Link" соответствовало бы только "Ссылка". А вот варианты "Ссылки", "Ссылок", и т.д. были бы "в пролете". Так, например, вплоть до Windows ME не могли по-человечески локализовать диалог копирования (по-моему, то в заголовке было написано "Копирования", то в каком-то предложении было неправильное склонение, я точно не помню).
Back to top
View user's profile Send private message Send e-mail
Умкус
Заглянувший



Joined: 21 Nov 2008
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Fri Nov 21, 2008 7:11 pm (спустя 5 месяцев 2 дня 18 часов 21 минуту; написано за 14 минут 58 секунд)
   Post subject:
Reply with quote

Лично я убеждён, что зашивание контента в код(ровно как и вёрстки) может быть хорошим решением только для небольших проектов(читай без БД). Ну непрофессионально это, как мне кажется. Лично у меня в системе эти 3 сущности: код, шаблоны и контент никогда и нигде не пересекаются.
Ну а если необходимо редактировать любой контент сайта через админку? А если ещё и контент динамически через админку же созданных разделов(новостей к примеру)?
Я в своё время решил создать отдельную таблицу `lang` (`i18n`/`content`/...) состоящую, из полей | `id` | `ru` | `en` | `de` |...|.
Таким образом таблица новостей, к примеру, будет состоять из логичных полей | `id` | `date` | `title` | `text` |, где `title` и `text` есть (int)ы, которые удобно связываются с соответствующими ключами из таблицы `lang` по нужной колонке в зависимости от текущего языка.
Здесь даже айдишники запоминать не надо, не то что бы даже вручную придумывать алиасы.
Дело только за оптимизацией и минимизацией запросов к базе.
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9995
   поощрить/наказать


PostPosted: Thu Jan 08, 2009 2:38 am (спустя 1 месяц 16 дней 7 часов 27 минут)
   Post subject:
Reply with quote


М

Перенесено из форума: Склад готовых решений :: PHP.
Перенесено в форум: Разное :: PHP.
Back to top
View user's profile Send private message
kazim09
Заглянувший
Warnings: 1


Joined: 06 Nov 2008
Posts: 2
Карма: 1
   поощрить/наказать


PostPosted: Sat May 23, 2009 11:53 am (спустя 4 месяца 15 дней 9 часов 14 минут; написано за 9 минут 40 секунд)
   Post subject:
Reply with quote

Я делаю так в своей системе:
языки храняться в БД
id_lang | caption | code
определяю язык по полю code(не важно как) и устанавливаю константу _ID_LANG_ из поля id_lang.
Для страниц у меня есть две таблицы
page - тут хранятся данные которые одинаковы для всех языков например
id_page | name | pos и т.д.
content_page тут хранится контент страницы
id | id_page(из таблицы page) | id_lang | title | text | meta и т.д.
И вывод, тут проблем нет
Code (SQL): скопировать код в буфер обмена
SELECT
        p.*, c.*
FROM
        page p,
        content_page c
WHERE
        p.name='_' AND
        p.id_page=c.id_page   AND
        c.id_lang=_ID_LANG_
для строк тоже есть таблица по сути такая же, в начале работы скрипта загружаю в массив $strings строки выбранного языка и в скрипте пишу так
Code (php): скопировать код в буфер обмена
echo (www.php.net/echo) $strings['send_button'];
Очень удобно использовать, добавление новых языков проблем тоже не вызывает.
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9995
   поощрить/наказать


PostPosted: Sat May 23, 2009 1:07 pm (спустя 1 час 14 минут; написано за 23 секунды)
   Post subject:
Reply with quote


М

kazim09, уберите рекламу из подписи.
Back to top
View user's profile Send private message
kazim09
Заглянувший
Warnings: 1


Joined: 06 Nov 2008
Posts: 2
Карма: 1
   поощрить/наказать


PostPosted: Sat May 23, 2009 2:57 pm (спустя 1 час 49 минут; написано за 18 секунд)
   Post subject:
Reply with quote

bæv
Это запрещено правилами форума?
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9995
   поощрить/наказать


PostPosted: Sat May 23, 2009 6:16 pm (спустя 3 часа 19 минут; написано за 2 минуты 23 секунды)
   Post subject:
Reply with quote

kazim09 wrote:
Это запрещено правилами форума?
— правилами форума запрещено пререкаться с модераторами:
Quote:
Требования модераторов или администраторов должны выполняться сразу и без пререканий!


!

Получаете предупреждение за невыполнение требования модератора.

Реклама на форуме — платная. По вопросам размещения платной рекламы обращайтесь к хозяину сайта — Дмитрию Кóтерову.
Back to top
View user's profile Send private message
nerezus
Заглянувший



Joined: 09 Jan 2009
Posts: 5
Карма: -2
   поощрить/наказать


PostPosted: Sat Jul 18, 2009 12:31 am (спустя 1 месяц 25 дней 6 часов 14 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Quote:
И еще вопросЖ как узнать в скрипте адрес текущей странички,
Пересмотреть архитектуру.
Роутинг сделать.
Back to top
View user's profile Send private message
webdizainer
Заглянувший
Banned


Joined: 16 Aug 2013
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Fri Aug 16, 2013 12:58 pm (спустя 4 года 29 дней 12 часов 27 минут; написано за 1 минуту 2 секунды)
   Post subject:
Reply with quote

спам удалён, спамер забанен
Back to top
View user's profile Send private message
Easyfutcoo
Заглянувший



Joined: 15 May 2015
Posts: 5
Карма: 0
   поощрить/наказать


PostPosted: Wed Jun 10, 2015 10:54 am (спустя 1 год 9 месяцев 24 дня 21 час 56 минут; написано за 21 секунду)
   Post subject: what kind of library!
Reply with quote

what kind of library! For several weeks I struggle in vain attempts to find such. Or at least the principle of its implementation. And that gettext is not all hosts, then this is true and that's what I said. Even more true to say that few have it all worth it. Russian hosters in this respect still more or less done,
Want to know about the content can click on the following:

goo.gl/3yO4Qn
goo.gl/2xgUbu
goo.gl/U6ZHNM
goo.gl/lvR4Rj
goo.gl/DOPLFd
Back to top
View user's profile Send private message
Fifacoinsdiy
Заглянувший



Joined: 16 Jul 2015
Posts: 5
Карма: 0
   поощрить/наказать

Location: Berlin

PostPosted: Thu Jul 16, 2015 12:09 pm (спустя 1 месяц 6 дней 1 час 14 минут; написано за 24 секунды)
   Post subject: My endure cavalcade argued that in the deathwatch of
Reply with quote

My endure cavalcade argued that in the deathwatch of his acclamation adeptness and on the eve of his additional termPresident Obama stands at what could be his “Truman moment” as a “post war” president. Added than a decade of war captivated the two acceding of the Bush administering and Obama’s aboriginal term. He now faces an acclaimed befalling to ablaze the commodity and architectonics the framework for an amiss but abiding peace Cheap Cabal 2 Alz (www.mmodiy.com/cabal-2.html).The cavalcade afflicted up absolutely of acknowledgment of a bulk of you. Some readers besmirched my estimation of the accomplished and the present. One clairvoyant remembered that longlong agoI was an ambitious artist and pacifist.Several readers took me to assignment for not advertence Obama’s third war.

 He has above from one accepted war in Iraq and promised to complete the abandonment from the additional -- the war in Afghanistan -- by the end of 2014. He is not accedence from a thirdhighly anarchistic war U.S. bombinate warfare adjoin doubtable agitator targets in the Boilerplate East and South Asia.The bombinate warfare advance threatens to bulk the admiral abundant of his political basal abroad. Endure weekthe PEW Global Attitudes Activity arise a abode with alloyed anniversary for Obama. The acceptable anniversary accepted that apple accessible appraisal animated Obama’s adeptness over Mitt Romney in the election Cabal 2 Alz (www.mmodiy.com/cabal-2.html). The bad anniversary lay in the accretion and boundless disapproval of his adopted activity in generaland abnormally his use of bombinate attacks.World criticismCriticism of Obama’s bombinate warfare advance stands at 80 percent in EgyptTurkey and Jordan; 75 percent in Spain and Japan; 63 percent in Franceand 59 percent in Germany.
Back to top
View user's profile Send private message
RikoD
Заглянувший



Joined: 12 Sep 2016
Posts: 1
Карма: 0
   поощрить/наказать

Location: Moscow

PostPosted: Mon Sep 12, 2016 3:27 pm (спустя 1 год 1 месяц 27 дней 3 часа 18 минут; написано за 2 минуты 8 секунд)
   Post subject:
Reply with quote

А вот это интересно, сам запускаю сайт и хочу сделать на двух языках - инглише и русском. Тоже пока заступорился на этом этапе. А еще (есди могу этот вопрос здесь задать) меня остро интересует момент с хостингом. Например, Umi предлагает бесплатный хостинг (но там это пакетом идет), доменное имя. Стоит подключаться или я самостоятельно, поднажав, сумею разрулить?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2
Page 2 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML