Многоязычность в рнр


Лучший способ реализовать многоязычность в PHP

У меня многоязычная система PHP с более чем 30 языками. Каждое определение выполняется с помощью define():

И существует более 400 определений.

Я сделал небольшое сравнение и создал абстрактный класс Lang с более чем 400 константами, и эти константы вместо define(), конечно, например:

Затем мне потребовались оба файла и назвали 1 define и 1 const из класса Lang. Затем я сделал анализ с webgrind, и результаты удивили меня:

1) требование файла с 400 define() заняло более 70% времени выполнения сценария 2) Использование абстрактного класса с константой намного быстрее, чем define()

Я хотел бы поделиться с вами этим анализом и спросить вас: оптимально ли и умно переписывать мою систему из «define()» многоязычного в «абстрактный класс с постоянным» многоязычным языком? Или, может быть, есть какие-то недостатки?

Мое спонтанное предположение заключалось в том, что define() — это вызов функции времени выполнения с определенными издержками, но определение класса и его константы анализируются во время компиляции. Отсюда и различие.

Сказав это, оба решения ужасны. I18n — это решенная проблема, которую не нужно снова изобретать. Самая большая проблема в i18n — это рабочий процесс, и вам нужны инструменты, которые поддерживают этот рабочий процесс. Этот рабочий процесс:

  • разметка переводимых строк в источнике
  • извлечение указанных строк в нейтральный формат исходного кода
  • перевод этих строк на разные языки
  • все вышеперечисленное асинхронно с параллельными изменениями, выполняемыми отдельными людьми, и сохранение всех синхронизаций между всеми вашими языками

Есть инструменты, которые уже делают все это, причем наиболее распространенным является gettext. Используйте его (или что-то подобное), не используйте константы.

Мультиязычность на PHP и MySQL

Уважаемые пользователи! Мы благодарим Вас за то, что Вам интересен нашен контент, поэтому с каждым днем хотим становиться все лучше и лучше!

Большое спасибо за вашу помощь и внимательность к нам!

Подготовил для Вас, пожалуй, очень интересный материал, который может быть полезен в применении мультиязычности на сайте, позволяющий переходить с одного языка текста на другой и обратно. В общем, рассмотрим мультиязычность на PHP и MySQL. На самом деле, этот скрипт очень даже простой и если использовать серьезный ресурс, например, социальную сеть или что-то подобного типа, то вряд ли он Вам сможет пригодиться. Поэтому мы сделаем следующее! Начнем с простого и будем постепенно переходить к сложному, по теме мультиязычноть на сайте.

Первое, что хочется отметить, проводить тесты мы будем на двух языках, это русский и английский. Так как, для примера, этого более чем достаточно. Главное Вам понимать основные особенности и структуру, тогда по идее вопросов не должно возникнуть или вообще их не будет. Начнем, пожалуй уже с кода и первое, что нам стоит сделать, так это создать базу данных MySQL, а уже после заниматься кодом на HTML, CSS и PHP.

Первая часть. MySQL.

Можно было конечно и обойтись без базы данных, но все же хотелось Вам показать полноценный вариант, типа мини страницы сайта, чтобы Вы смогли уже вникнуть и понять, как по идее должно все работать. Для этого мы создаем базу данных MySQL с названием language, в которой будем хранить две таблицы: news и language.

База данных будет иметь привилегии такие же как и ее название, то есть MySQL BD: language, MySQL HOST: localhost, MySQL USER: language, MySQL PASS: language. В первой таблице news, мы будем хранить все новости или в нашем случае новость, во второй таблице language, мы будем хранить различные языки, в нашем случае русский и английский. Ну, а теперь давайте перейдем к самим таблицам, а точнее к ее дампу и наполнению.

Структура таблицы news с наполнением. Весь текст, который в исходниках я не стал тут писать, так как не вижу никакого смысла)

Дамп таблицы news.

Структура таблицы language с наполнением.


Лучший способ реализовать многоязычность в PHP

У меня многоязычная система PHP с более чем 30 языками. Каждое определение выполняется с помощью define ():

И существует более 400 определений.

Я сделал небольшое сравнение и создал абстрактный класс Lang с более чем 400 константами, и эти константы вместо define (), конечно, например:

Затем мне потребовались оба файла и назвали 1 define и 1 const из класса Lang. Затем я сделал анализ с webgrind, и результаты удивили меня:

1) требование файла с 400 define() заняло более 70% времени выполнения скрипта 2) Использование абстрактного класса с константой намного быстрее, чем define ()

Я хотел бы поделиться с вами этим анализом и спросить вас: оптимально ли и умно переписывать мою систему из «define ()» многоязычного в «абстрактный класс с постоянным» многоязычным языком? Или, может быть, есть какие-то недостатки?

Многоязычность

dtmax

Guest

Меня интересует, какие у кого есть идеи реализации многоязычности на
php-сайте.

Сам пока вижу 2 пути.
1) создавать словари для каждого языка, например

$hello=»Hello in english»

$hello=»Привет по-русски»

И в зависимости от языка, в котором посетитель смотрит сайт, показывать ему
нужный текст. Достоинсва: легко добавить новый язык. Недостатки: путаница,
если сайт большой; неудобство в редактировании — возможно в тектсте нужны
вкрапления HTML.
2) использовать в темплитах функцию типа
showText($english_text,$russian_text). Достоинства — все под рукой, смотришь
в шаблон страницы, меняешь что надо. Недостатки — более громоздкий код в
шаблонах; трудно добавить новый язык.

Может, есть какие-то более прогрессивные идеи?
Посоветуйте, плз, или дайте ссылки на примеры других реализаций.

Многоязычность в рнр

Курс предназначен для базовой подготовки администраторов сайтов, созданных на «1С-Битрикс: Управление сайтом». Изучив курс, вы освоите основные методы администрирования системы, а также пополните знания по темам, изученным в курсе Контент-менеджер.

Если вы добросовестно изучите курс, то научитесь:

  • управлять доступом к системе, сайтами, пользователями, группами пользователей;
  • работать с инструментами системы;
  • использовать возможности интерфейса по управлению системой;
  • работать с модулями «1С-Битрикс: Управление сайтом», связанными с оптимизацией и безопасностью работы сайта;
  • выполнять работу по конфигурированию веб-системы для оптимальной работы.

Если вам предстоит самостоятельная установка системы или перенос сайта на хостинг, то без курса Установка и настройка Курс Установка и настройка предназначен для специалистов устанавливающих «1С-Битрикс: Управление сайтом» или «Битрикс24 в коробке».

Начальные требования

Необходимый минимум знаний для изучения курса:

  • базовые навыки компьютерной грамотности и навыков работы с ОС Windows;
  • базовые знания о WWW и организации доступа к веб-серверу;
  • знание системы в рамках курса Контент-менеджер Мы считаем, что вы этот курс уже прошли и знаете многое о Битриксе. Поэтому подсказок во всплывающих окнах будет намного меньше, чем в курсе Контент-менеджер. , чтобы банально не путаться в интерфейсе.


Неплохо было бы иметь базовые навыки установки и администрирования *nix-систем.

Тесты и сертификат

После изучения курса пройдите тесты на сертификацию. При успешной сдаче последовательности тестов на странице Моё обучение вы увидите результат обучения и там же — ваш сертификат в формате PDF.

Иконка успешно сданного вами курса отображается в вашем профиле на Freelance, если вы укажите ссылку на ваш профиль на сайте компании 1С-Битрикс.

Комментарии к урокам

На каждой странице курса авторизованный на сайте посетитель может дать комментарий к содержимому страницы. Комментарий — не форум, там не ведётся обсуждений или разъяснений. Это инструмент для сообщений нам об ошибках, неточностях. Для отправки комментария воспользуйтесь расположенной в правом нижнем углу окна браузера кнопкой:

Для преподавания оффлайн

Если данный курс берётся в качестве основы для оффлайного преподавания, то рекомендуемая продолжительность: 3 дня (24 академических часа).

Если нет интернета

Экономите время и учитесь по дороге на работу или в ВУЗ? Для этого нужны файлы. Мы предоставляем две возможности оффлайнового изучения: файлы в формате PDF и CHM, они открываются на любых устройствах. Программы для чтения доступны в AppStore и Play Market. Файлы обновляются периодически, но всё равно будут отставать от онлайновой версии курса. Поэтому, всё же, мы рекомендуем он-лайн версию курсов, тем более, что мобильный интернет сейчас не проблема.

Чтобы отключить подобное отношение к файлу необходимо:

Илон Маск рекомендует:  Что такое код asp dirbrowseshowdate

    перейти в свойства файла на вкладку Общие. Внизу у Вас отобразится сообщение о том, что этот файл был заблокирован системой с целью защиты компьютера.

Отсутствие кнопки Разблокировать возможно в двух случаях:

  1. Файл лежит не локально, а на сетевом ресурсе.
  2. Если файл лежит на локальном диске, но путь к нему содержит спецсимволы (# и прочие).

Как сделать мультиязычный сайт

Наверняка, Вы видели сайты, которые сделаны на нескольких языках. Это очень хорошо, поскольку количество трафика может резко возрасти, а это резко возрастающий доход. Поэтому серьёзно задумайтесь о мультиязычности, а вот, как сделать мультиязычный сайт, я постараюсь сейчас объяснить.

Вообще, существует множество способов сделать сайт на нескольких языках, однако, я приведу, на мой взгляд, самый простой и универсальный способ. Первым делом необходимо создать ini-файлы с языковыми константами. Например, такой:

Пусть этот файл называется «ru.ini«. Теперь создадим файл для английского языка:

Этот файл мы назовём «en.ini«. Теперь нам нужно как-то определять, какой язык хочет пользователь. Для этого есть GET-параметры, в котором мы передаём код языка (допустим, «ru» или «en«). Далее мы в зависимости от значения GET-параметра, берём нужный файл и выводим языковую константу, а значение подставится автоматически. Чтобы стало понятно, привожу код:

Как Вы уже догадались, будет выведено «Привет«, если передано значение «ru«, либо «Hello«, если передано значение «en«. Разумеется, вместо GET-параметров Вы можете использовать, например, сессию. Всё очень просто, а уже эту готовую базу, можно использовать и успешно применять в огромных проектах.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 51 ):

    мне кажется сессии удобнее использовать

    Я тоже так думаю, но почему-то GET-параметры чаще используются для мультиязычности.

    Так таким способом когда переходишь на другую страницу, становится снова стандарт. Как сделать чтобы все сохранялось пока не изменить язык?

    а как быть с мета тегами в слуае если урл один и тот же, ведь поисковики считают страницу ../ru и . /en разными а если с куки то они просто не просканируют старницы с другими языками, или я чего о не знаю?

    Можно ли в базе хранить английские тексты, и вытягивать их когда надо?

    Алексей! Вы должны боротся за каждый килобайт информации! Так будут экономичнее расходоватся ресурсы вашей системы.

    Да, можете. Ведь бывают не только пункты в меню переведённые (для них база совсем не нужна), а вот если у Вас и много статей на разных языках, то, конечно, храните их в базе данных.

    А что будет быстрее, isset или array_key_exists? Я обычно работаю со вторым, у меня получается вот так: $var = array_key_exists(«var»,$get)?$_GET[«var»]:NULL;

    Не знаю, какая быстрее, но я привык к isset(), как к более универсальной.

    а как создать меню для пользеватиля чтоб он мог выберать из списка язык для сайта ?

    Создайте обычное меню на HTML, где просто вставьте ссылки с соответствующими GET-запросами.

    а как переводить (заменять) большие тексты? нопримкр который хрониться в базе даных и 4ерез GET-параметры вывести

    В этой базе должна быть аналогичная таблица с такими же текстами, но на другом языке. И при анализе языка, нужно делать выборку из соответствующей таблицы.


    как сделать чтобы .ini вытаскивались к примеру из папки lang

    Всё точно так же, просто пиписываете ещё и адрес. «нужный_адрес».$lang.».ini»

    ставил только выдает ошибку вот пример че не так делаю $array = parse_ini_file(«leang»$lang.».ini»); где-leang имя папки где лежат файлы папка в корне вот ошибка Parse error: syntax error, unexpected T_VARIABLE in Z:\home\invest\www\index.php on line 3

    Точку Вы не поставили между строкой и переменной $lang

    сделал вот так заработало(«leang/».$lang.».ini»);

    можно ли сделать чтобы автоматом определяло если СНГ трафика то руский остальные английский

    Можно по IP адресу определять страну и сразу выставлять нужные настройки. http://myrusakov.ru/php-ip-user.html

    Не подскажите почему код неработает если языковые файлы ini сохранены в формате UTF-8?То есть вообще например ничего не выводит? Если сохранять в Ansi то работает. Ведь это немаловажно для мультиязычности.

    Ваш сайт должен быть в одной кодировке. Нельзя делать так, чтобы в одном месте был UTF-8, а где-нибудь в другом месте ANSI.

    Так и есть сайт в UTF-8! На сайте прописано . Но это все равно не работает то есть вообще ничего не выводит! Если ini сохранить в Ansi а сайт оставить в кодировке UTF-8 то тогда выводит кракозябры. Если сайт в ANSI и ini файл Ansi тогда нормально. Если сайт в UTF-8 и файл ini в UTF-8 тогда вообще ничего не выводит. Тестировал на разных машинах в разных браузерах в разных веб-серверах везде делает, как описано выше. Как быть?

    Все ясно! В приведенной Вами ссылке была вторая причина. ini файл нужно сохранить как «Преобразовать в UTF-8 без BOM». Спасибо!

    Я сейчас делаю социалку, и пока что 3 языка, но я храню все в отдельном файле в переменных или масивах. Подскажите может лучше переделать на .ini.

    Лучше переделать на ini.

    это будет безопасней.

    Причём тут безопасность? Это будет логичнее с точки зрения грамотного кода.

    спасибо, буду переделывать.

    Михаил, тема понравилась. Но есть еще важный вопрос. Вить большинство сайтов (форумы,блоги) используют мультиязычность. Очень важным элементом является то что выбранный язык всегда хранится в адресе страницы и так на какую либо страницу. Пример: http://mysite.com/ru/ или http://mysite.com/?lang=ru или http://mysite.com/index.php?lang=ru Мне не обязательно знать как делать ЧПУ (потом разберусь). А вот как постоянно хранить переменную в ссылке, вот это меня ооочень волнует!

    Можно записывать в cookie язык и не менять его до тех пор, пока пользователь не выберет другой язык. Тогда в каждой ссылке держать язык необязательно.

    До этого как ни странно, я уже давно догодался. А вот если я хочу показать тему человеку, и отправляю ему ссылу (допустим на русскоязычный форум). Но в ссылке не указан выбранный язык, т.е. русский. И человек по стандарту попадает на английский форум. Например: http://mysite.ru/index.php?lang=ru&post=1 http://mysite.ru/index.php?post=1 В данном примере разные страницы. Т.е допустим что у этого сайта стандартный АНГЛийский язык. Человек нажимая по первой ссылке перейдет туда, куда этого хочет тот который дал ему эту ссылку. А нажатие по второй ссылке приведет его на какую то английскую тему. И будет что то: — А чо там все на англ? — Та не, у меня всё на русском. — Та не ври. Ну в общем я думаю вы поняли меня что мне надо методом GET передавать выбранную языковую часть сайта.

    Можно по IP определять, какой у человека язык. Или ставить язык по умолчанию, а если в GET что-то указано, то брать его.

    Одскажите как экранировать к примеру апостроф в eu.ini да еще если в предложение получается предлог on вылетает ошибка экранировать таким способом /’ или /on получается но слеш тоже тогда появляется в предложении

    Все решение нашол «‘» и «on»


    Здравствуйте, Михаил Русаков, посвятите пожалуйста видео урок как создаются многоязычные сайты, так как информация на ваше сайте не совсем понятна. Не очень понятно куда нужно вставлять эти тексты и куда. С уважением Евгений Голубев.

    Простое решение мультиязычности — http://sli.su

    А как насчет СЕО? Будут эти файлы ini просканированны поисковиками как контент?

    Если сделать ссылки на различные языки, то всё будет проиндексировано.

    Михаил, вот у Google есть приложение для перевода текста прямо на сайте, например есть статья, она сразу же переводится при просьбе пользователя, это лучше, чем то, что у Вас?

    Перевод от Google ужасен, как и у любого другого автоматического переводчика.

    Помогите пожалуйста сделать навигацию на этот код более 12 страниц т.е что-то типа этого ( [Последняя] >>)сайт kulturanevel.ru

    Илон Маск рекомендует:  Что такое код asp useragent

    Владимир, добрый день, на нашем сайте есть статья по данной тематике: http://myrusakov.ru/php-page-navigation.html

    Можно ли в этот код вставить (ПЕРВАЯ) (ПРЕДЫДУЩАЯ) (СЛЕДУЮЩАЯ)(ПОСЛЕДНЯЯ) если будет к примеру 20 страниц, сможет ли этот код работать. ( [Последняя] Сейчас там просто ссылки на странички.

    Владимир, нет конечно

    А есть что-то подобное для организации мультиязычности в JAVA скриптах? Например если скрипт выводит информацию или что-то запрашивает у пользователя, то это также должно быть на языке страницы. Можно конечно массив констант выводить в скрытом поле страницы, а скрипт будет вытаскивать нужные значения, но это грабли. Может есть более изящное решение

    Сделал всё как надо и добавил ссылку вида ?lang=en. При обновлении страницы всё нормально, но при переходе на другую устанавливается русский. Как избавиться от этого? Я даже буду согласен на постоянное отражение переменных в адресе типа mysite.ru/index.php?lang=en Так же проблема в том, что если не устанавливать значение GET параметра или перейти на url вида ?lang=god и любой другой не существующий, то весь текст на сайте пропадает совсем. Как установить язык по-умолчанию чтобы этого небыло? Помогите пожалуйста Может использовать куки?

    FlixTheBro потому, что условие неправильное(он буде искать любое значение файла которое вводишь, а так как нету god.ini отсюда и пустой текст), надо ещё дописать && $_GET[‘lang’]==en и в сессию занести значение и усе.

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    многоязычный PHP — лучший способ определить язык посетителя и перейти к контенту

    Как я могу сделать многоязычный сайт? в этом URL есть некоторая информация, но она не совсем понятна о многоязычности.

    мы хотим построить многоязычный сайт в php. где у нас есть статья, меню, книга и многое другое таблицы

    Все таблицы будут иметь многоязычный безлимитный язык, мы назначим язык в базе данных. и тогда новый язык покажет в форме вставки, как

    язык

    статья — стол

    article_language

    поэтому, когда я включаю новый язык для таблицы, справа появится вкладка, и строка запроса будет выглядеть как ln = English, поэтому она вставит данные английского языка в статью.


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

    1 ответ

    Похоже, у вас конец базы данных проработан довольно хорошо. Это выглядит хорошо для меня.

    На стороне клиента вам не нужно добавлять язык в строку запроса. Это создает больше работы для вас, потому что вам нужно динамически добавлять эту строку запроса к каждой ссылке, потому что она будет отличаться для каждого сайта.

    Некоторые сайты используют каталоги верхнего уровня, такие как http://www.example.com/en/ и http://www.example.com/de/ , но, на мой взгляд, лучшим способом было бы купить ДВУ с кодом страны ( нДВУ ) поэтому разные языки вашего сайта будут находиться в разных доменах: www.google.com , www.google.com.es , www.google.de . Затем вы можете использовать HTTP Accept-Language заголовок Accept-Language чтобы определить, в какой домен перенаправлять. Вы можете использовать такой язык, как PHP, для анализа заголовка Accept-Language пользователя .

    Я бы рекомендовал использовать нДВУ или каталоги верхнего уровня над строками запросов для вашего здравого смысла, а также для упрощения работы поисковых систем. Некоторые пауки не понимают корреляции между ln=en в строке запроса и возвращаемым языком. Использование ccTLD проинформирует паука без какого-либо вмешательства с вашей стороны, что контент подается на определенном языке для конкретной локали.

    Это напоминает мне, что вы также должны указывать в своем ответе правильный заголовок HTTP Content-Language . В php это будет выглядеть так:

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

    РЕДАКТИРОВАТЬ: Как указал @RepWhoringPeeHaa, вы также можете указать язык в всех ваших HTML-файлов с помощью:

    Лучший способ реализовать многоязычность в PHP

    У меня многоязычная система PHP с более чем 30 языками. Каждое определение выполняется с помощью define():

    И существует более 400 определений.

    Я сделал небольшое сравнение и создал абстрактный класс Lang с более чем 400 константами, и эти константы вместо define(), конечно, например:

    Затем мне потребовались оба файла и назвали 1 define и 1 const из класса Lang. Затем я сделал анализ с webgrind, и результаты удивили меня:

    1) требование файла с 400 define() заняло более 70% времени выполнения сценария 2) Использование абстрактного класса с константой намного быстрее, чем define()

    Я хотел бы поделиться с вами этим анализом и спросить вас: оптимально ли и умно переписывать мою систему из «define()» многоязычного в «абстрактный класс с постоянным» многоязычным языком? Или, может быть, есть какие-то недостатки?

    Мое спонтанное предположение заключалось в том, что define() — это вызов функции времени выполнения с определенными издержками, но определение класса и его константы анализируются во время компиляции. Отсюда и различие.

    Сказав это, оба решения ужасны. I18n — это решенная проблема, которую не нужно снова изобретать. Самая большая проблема в i18n — это рабочий процесс, и вам нужны инструменты, которые поддерживают этот рабочий процесс. Этот рабочий процесс:

    • разметка переводимых строк в источнике
    • извлечение указанных строк в нейтральный формат исходного кода
    • перевод этих строк на разные языки
    • все вышеперечисленное асинхронно с параллельными изменениями, выполняемыми отдельными людьми, и сохранение всех синхронизаций между всеми вашими языками

    Есть инструменты, которые уже делают все это, причем наиболее распространенным является gettext. Используйте его (или что-то подобное), не используйте константы.

    Многоязычность в рнр

    Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!


    Многоязычность в РНР
    Автор: Кирилл Карпенко
    21 июня 2006 года

    Привет всем читателям!

    Сегодня мы рассмотрим довольно важную тему, которая выдвигается многими работодателями, а именно мультиязычность.

    Что же я имел ввиду, говоря о мультиязычности. Ну, наверняка каждый из моих достопочтенных читателей не раз видели крутые порталы и между всем сбродом информации находили две маленькие иконки, преимущественно со всем известным звёздно-полосатым и родным бело-сине-красным флагами. Безусловно, после нажатия на одну из них привычная нам русская речь превращалась в буржуйский language (), или наоборот. Но задавали ли вы себе когда-либо вопрос о том, как это всё делается. Что ж, именно об этом я и буду вести речь.

    Сразу скажу, что для работы с тем материалом, который будет здесь изложен вам понадобиться поддержка РНР не ниже 4.39.

    Итак, как вы знаете, содержание нашего сайта разделяется на динамическое и статическое. К статическому содержанию мы отнесём то, что не будет изменять своё значение в процессе работы (ключевые слова, текст ошибок, и прочая белиберда). С этого мы и начнём. Но давайте проанализируем, как именно мы будем изменять язык данного текстового значения. Надеюсь, никто не предложил воспользоваться исключениями, ибо это настолько нерационально, что нерациональней и быть не может. Вместо этого я предлагаю воспользоваться константами (о типе данных читайте на php.net). Мы просто будем объявлять служебное слово, которое в зависимости от значения языка соответственно будет менять и своё значение. Как мы это сделаем? Да как и все, создадим два (к примеру) разных файла, имена которых будут носить такой шаблон:
    Язык_map.php;

    Как вы уже поняли вместо слова `язык` мы подставим значение, характеризующее данный язык. В нашем случае мы будем использовать двухсимвольный код языка (ru, en, ua, pl и т.д.).

    Что ж теорию выяснили теперь давайте, применим наши знания на практике. Создаём два файла. Я создал файлы с английским переводом и русским, а как создадите вы это уже на ваш вкус.
    Файл: en_map.php

    Файл: ru_map.php

    Итак, на мой взгляд, ничего сложного нет, и всё написанное подчиняется самым банальным законам РНР. Сначала мы делаем проверку, не были ли константы уже объявлены, если были, то не объявляем, в противном же случае объявляем.

    Это была лёгкая часть, теперь давайте перейдём к более сложной теме — к переводу динамической части.

    Допустим, у вас есть большая портальная система или простой сайт, но вы, талантливый программист знающий все аспекты РНР, не являетесь его владельцем, а сделали его под заказ. Владельцем же является полным дизайнером (), который не слухом, не духом о каких-то там программистских тонкостях, но у него есть одно лишь желание, чтобы всё работало, и он мог изменять всё. Насчёт всего, это уже другая история, а вот языковые параметры сайта мы ему всё-таки разрешим изменить (да что там, чем бы дитя ни тешилось ).

    Но опять возвращаясь к дилемме о «Дизайнерах и Программистах» нужно опять упомянуть что такой сайт должен полностью быть, так сказать «Что Видишь То И Получишь», иначе нельзя. Поэтому я постараюсь сделать всё так, чтобы оно не вызывало нервного тика у программистов, и могло удовлетворить дизайнеров (имеется ввиду юзабилити).

    Итак, долой пустые слова и вперёд на Берлин. Мы начнём с теории. Итак, как же мы будем различать языки у динамического содержания, которое в лучшем случае удаляется, изменяется, а то и чего хорошего вообще накроется. Константами тут никак не обойтись, что же делать?

    Я уже слышу витающие вокруг вас мысли.

    Лично когда я пытался воплотить это в жизнь, то сначала я это сделал самым нерациональным способом, а именно для перевода статей разделил поля в таблице, которые подлежали переводу надвое (то есть, создал поле_eng и поле_ru) таким образом, и так большие по объёму таблицы превратились просто в непристойно огромные. Поэтому я начал искать альтернативу, и не поверите, нашёл её. Чувствуете уже теплее, да, скоро мы подойдём к самому горячему. Я нашёл выхода из этой ситуации, и сейчас намерен объяснить на пальцах его вам, и то поймёте ли вы его или нет, будет зависеть от вас. Сначала давайте, согласуем все детали.

    Для начала нам нужна, будет таблица, в которой будут размещаться данные для перевода. Скажем у нас есть таблица `articles` в которой будут размещены некоторые статьи, и они должны иметь, скажем, два перевода, но один обязательно. Нас будут интересовать лишь два ключевых, в нашем случае, поля: название, описание. Мы будем осуществлять структурирование текста таким образом:
    Английский вариант статьи
    Русский вариант статьи

    После строка ввиде комбинации из этих двух структур и будет добавляться в поля `title` и `description` таблицы `articles`.

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

    Воспользовавшись функцией substr(). В качестве первого параметра будет сам текст, в качестве второго длина открывающей конструкции, в качестве третьего (самое интересное) разница между первым вхождением закрывающей конструкции и длинной текста. Да, понимаю это не так легко, но это нужно понять. Поэтому мы сейчас это и проделаем на практике. Я создал функцию, которая будет выделять текст между ключевыми тегами. Она будет принимать три параметра: текст для разбора, язык по которому нужно проводить парсинг, массив конструкций.
    ‘,’ ‘)) <

    $data=substr($data,$start_tag,$count);
    if(trim($data)==») <
    $data=NOT_ENTERED;
    >
    return $data;
    >
    ?>

    Как видите довольно длинно и можно запутаться, но если вы и не поняли этого, то это не большая беда, ибо функция для перебора уже есть, а чуть дальше я рассмотрю другой метод для этой же цели. Да, и не забудьте где-нибудь объявить языковую константу NOT_ENTERED, которая будет присваиваться результату работы функции в случае, если длина текста равна нулю.

    Так, с перебором выяснили, но теперь перед нами предстаёт новая задача, компиляция обычного текста в спецформатированую строку. Это уже намного проще, и если вы достаточно хорошо знаете РНР, то вы без труда напишите такую функцию, а если пока плаваете, то прошу в кабинет .

    Алгоритм не сложный и заключён в том, чтобы подставить в все языковые конструкции в одну строку. Сначала я в порывах лени я хотел ограничить скрипт определённым числом языков (так его воплотить легче), однако после одумался и получил вот что:
    ‘,’ ‘)) <
    if(!is_array($data)) <
    die(PARAM_CHECK_ERROR);
    >
    $data=»;
    $temp=»;
    $count=0;
    foreach($data as $k=>$v) <
    if(!is_string($k)) <
    break;
    >
    $count++;
    if($count>1 & $temp=$k) <
    die(ERROR_CONSTRUCTION_COUNT);
    >
    $temp=$k;
    $data.=$delimiters[0].$k.$delimiters[1].$v.$delimiters[2].$k.$delimiters[3];
    >
    return $data;
    >
    ?>


    Ну, здесь я немного поясню. В качестве параметра функция принимает массив. Структура массива должна быть такой:
    «индификатор языка»=>»текст»;

    После мы делаем проверку, что если полученный параметр не массив то .

    Если же это всё же массив то конечно делаем его перебор, и на место языка в конструкции ставим ключ данного элемента ассоциативного массива, а на место текста безусловно сам текст а то есть значение переменной $v. После сливаем все данные в одну строку. Но я забыл упомянуть об одной важной детали, а другими словами о довольно большом куске текста. Сначала перед циклом мы объявили три переменные: data, temp, count;

    Переменная count- это количество итераций цикла, и с каждым следующим кругом цикла счётчик увеличивается. Переменная data- это будущая результирующая строка, в которую будут сливаться все языковые конструкции. Но более интересны переменные count и temp. Для чего они нужны? Ну, наверное, большинство уже догадались, прочтя исходник, но тем до кого ещё не я поясню. Это делается для проверки того, что языковая конструкция не была повторена более раза. Для этого мы и объявили переменную count. Так как её значение по умолчанию равно нулю, то мы проверяем, что цикл был выполнен хотя бы раз, поскольку если мы этого не сделаем то, выйдет что-то подобное 2=2 или 0=0, ведь значение $k ещё не успело измениться. Так как в первый раз проверка будет игнорироваться, мы после проверки присваиваем значение переменной $temp. Это делается так же не просто так. При первой итерации всё пойдёт нормально, но ведь если мы всё же присвоили значение до проверки, то проверка делала бы проверку, о которой уже упоминалось (2=2, 3=3 и т.д.). Вот зачем мы делаем именно так.

    Теперь как логическое завершение мы создадим небольшой сайт, где и будет применяться всё вышеизложенное:
    ‘,’ ‘)) <
    $data=substr(
    $data,
    (strpos($data,$delimiters[0].$lang.$delimiters[1])+
    strlen($delimiters[0].$lang.$delimiters[1])),
    (strpos($data,$delimiters[2].$lang.$delimiters[3])-strlen($data))
    );

    function compilateLanguageString($data,
    $delimiters=array(‘ ‘,’ ‘)) <
    if(!is_array($data)) <
    die(PARAM_CHECK_ERROR);
    >
    $data=»;
    $temp=»;
    $count=0;
    foreach($data as $k=>$v) <
    if(!is_string($k)) <
    break;
    >
    $count++;
    if($count>1 & $temp=$k) <
    die(ERROR_CONSTRUCTION_COUNT);
    >
    $temp=$k;
    $data.=$delimiters[0].$k.$delimiters[1].$v.$delimiters[2].$k.$delimiters[3];
    >
    return $data;
    >

    //Не забываем о
    if(!isset($_GET[‘lang’])) <
    setcookie(«lang»,$_GET[‘lang’]);
    header(«Location: index.php?module=home»);
    >

    if(isset($_COOKIE[‘lang’])) <
    include $_COOKIE[‘lang’].»_map.php»;
    >
    else <
    include «ru_map.php»:
    >

    if(isset($_POST[‘add’])) <
    $description=compilateLanguageString(
    array($_POST[‘description_en’],$_POST[‘description_ru’]));
    $title=compilateLanguageString(
    array($_POST[‘titlte_eng’],$_POST[‘title_ru’]));

    //Процесс добавления в базу
    >

    echo» «;
    echo» «;
    echo» «;
    $title=($_SERVER[‘REMOTE_ADDR’]==’127.0.0.1′)? ADMIN_WELCOM: ‘Гостям- Здрасте !’;
    echo $title;
    echo» «;
    echo» «;
    echo» «:
    echo» «;

    $conn_ );
    @mysql_select_db(«somedatabase»);
    $q=@mysql_query(«SELECT title, description FROM `articles` LIMIT 0,1»,$conn_id);
    if(@mysql_ num_rows($q)==0) <
    ARTCILES_NOT_FOUNDED;
    >
    else <
    $row=@mysql_fetch_array($q);
    $title=subTextByLang($row[‘title’],$lang);
    $description=subTextByLang($row[‘description’],$lang);
    echo»

    «:
    echo»

    «;
    echo»

    «;
    echo»

    «;
    echo»

    «.ARTICLE_TITLE_TEXT.» «.
    $title.»
    «.
    ARTICLE_DESCRIPTION_TEXT.»
    «.$description.»

    «;
    >

    //Это ещё полбеды, теперь нужно создать форму для добавления статьи
    echo»»;
    ?>

    Что ж вот и всё. Однако в скрипте есть одно «но», автор не может через форму добавить более двух вариантов перевода. Не буду, как остальные автора, что сделал это для вашей тренировки, поскольку если честно то когда я дошёл до этого места у меня уже голова почти не варила, поэтому я и оставляю это на ваших плечах. Поверьте, вариантов решения полно, и я очень надеюсь, что вы его найдёте. Относительно функций, то не могу сказать на все 100% что они не вызовут сбоя но фатальных ошибок быть не должно, хотя всякое бывает. Но я уверен более чем на 60% что синтаксис нарушен, так как я не тестировал примеры. А вот здесь для вас действительно хорошая тренировка ведь ловля «блох» очень полезное занятие!

    Что ж, я считаю, что на этом статью можно окончить. Если у вас не будет получаться, не сгоняйте зло на ваш бедный компьютер, на клавиатуру, и тем более на разработчиков такого замечательного языка как РНР, смело, все свои неудачи адресуйте в мою сторону. Я не думаю, что мне от этого станет хуже, а вот вам будет на кого согнать злость.

    Опубликовал Kest Ноябрь 06 2008 19:47:58 · 0 Комментариев · 5495 Прочтений ·

    • Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •

    Комментарии
    Нет комментариев.
    Добавить комментарий

    Рейтинг доступен только для пользователей.

    Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

    Вы не зарегистрированны?
    Нажмите здесь для регистрации.

    Забыли пароль?
    Запросите новый здесь .

    Многоязычность в рнр

    Добавлено 17.01.05, 11:02

    Ну, в фактических реализациях оно так и делается. Я бы, правда, предпочел парсить .po-файлы и использовать нативный gettext, а на эти функции скатываться в случае отсутствия расширения gettext. Во всяком случае, оно давно является своего рода стандартом в GNU, стандартом весьма успешным, и пользовать что-либо другое я не стал бы и не советовал по этой самой причине.

    А насчет вопроса — человек, по всей видимости, интересуется тем, как это вообще делают.

    Илон Маск рекомендует:  Определение ip адреса с помощью perl
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL
    Рейтинги