SlideShare a Scribd company logo
1 of 25
Download to read offline
Трудности перевода:
как построить мультиязычный сайт
на WordPress
Сайт на другом языке (языках)
На сайте только один язык?
Да
Нет
Нет
Да
Локализация → 1
Мультиязычный сайт → 3
Языковые версии сайта → 2
Контент на разных языках должен совпадать
Утилита Unix gettext()
Источники данных для утилиты gettext() - файлы .mo,
скомпилированные “языковые БД” особой структуры
То, из чего компилируютя файлы .mo - файлы .po
Локализация → 1
1 -> язык
2 -> языка
11345 -> языков
языки
4 варианта
Особая проблема - мультиязычные формы
Работает утилита Unix ngettext()
Запись мультиязычной (plural) формы на
псевдоязыке в заголовке файла .po
Уникальна для каждого языка
Альтернатива gettext() - база данных
Вызов gettext()
в PHP
*nix вызывает
свою утилиту
gettext()
Обращение к
файлу .mo
Работа gettext() в файле .mo по
поиску словопары
Найдено?
отдаем то что
найдено
Да
отдаем оригинал
Нет
Загрузка страницы
Выгрузка из БД
всех словопар в
виде массива в
память
Массив словопар [ ]
Вызов gettext()
в PHP
хук gettext()
Повышение производительности: нет ни
обращения к файловой системе, ни
механизма поиска в файле .mo
Запись URL мультиязычных сайтов и языковых версий сайта
http://site.com/meetup-page/?lang=fi
http://site.com/lang/fi/meetup-page/
http://fi.site.com/meetup-page/
RewriteEngine on
RewriteCond %{HTTP_HOST} ^fi.site.com
RewriteRule ^(.*)$ http://site.com/lang/fi/$1 [L,NC,QSA]
Добавление правил в .
htaccess позволяет не
создавать никаких реальных
языковых субдоменов
Языковые версии сайта → 2
EN версия сайта в поддиректории
URL
http://doklad.wpru/en/
Почему такое возможно:
.htaccess WP при создании ЧПУ
(почти такой же .htaccess в Yii FW)
Мультиязычный сайт → 3 Принципы создания - всего два
Контент (ru)
Тот же контент
на другом языке
(fi)
Параллельный контент в БД
Переключение контента в зависимости от
URL, в котором содержится язык
Создание отдельно переводов
Запрос контента
Буфер, следящий за URL
В URL есть язык?
Да
Отдаем перевод
Нет
Отдаем оригинал
ф-я обертка над
любым контентом
_translate()
Плагин WPML
Это локализация по
принципу из БД
Основной плагин
WPML работает по принципу
создания параллельного
контента
Стили URL - нет
варианта с языковым
ключом
После инсталляции
плагина - возможность
добавить перевод
Оригинал Перевод
Локализация в
WPML называется
перевод строк -
отдельный плагин.
Делается вручную
Те самые параллельные
посты
Связь поста и перевода
в БД в отдельной
таблице плагина WPML
Локализация в WPML - либо загрузка .mo файлов, либо вручную
Это отдельный плагин в составе WPML
Наш плагин для создания
мультиязычных сайтов
One Click Localize -> OCL
Трудности перевода :)
Русская и английская версия сайта плагина OCL
Биллинг
Оплата
Генерация ключа
api_key
Генерация плагина,
привязанного к ключу
Создание и размещение zip-
архива
Главная ф-я ядра плагина - ф-я _ocl() (часть 1)
ф-я _ocl() продолжение и
финал
Трудность 1 - локализация
Первая попытка покорить мир
Заливка файлов .po ВСЕХ
официальных локализаций
WP
Приведение
псевдокода
файлов .po в PHP,
разбор словопар
Внесение
локализаций в БД
БД всех
официальных
локализаций WP,
которые есть в мире
Это создание PHP из псевдокода
для plural вариантов
При инсталляции плагина и/или
добавлении языков
локализации нужных языков вносятся в
БД установленного WP
Трудность 2
Автоматический перевод
_ocl() Запрос к системе
автоматического перевода
Сервис Сложность
работы
Платный Что можно
переводить
Перевод с тегами
HTML
Yandex Низкая Условно нет, есть неописанное
суточное ограничение на число
запросов
Сайт с малым
обновлением
контента
Да, но требует
правки
Google Средняя $20 за 2 миллиона знаков 2 млн. знаков - это
примерно 1400
страниц среднего
размера
Да, идеально
Bing Высокая $20 за 2 миллиона знаков -//- Да, идеально
Трудность 3
Тестирование плагина для разных версий WP
Общая БД, разные
версии WP имеют
разные префиксы
2.8.1
Файлы
проинсталлированных
версий WP
Папка с плагином -
символическая ссылка
3.0.1 Папка с плагином -
символическая ссылка
...
4.1.2 Папка с плагином -
символическая ссылка
...
Реальная папка, в которую
размещается плагин
URL: .../2.8.1/
URL: .../3.0.1/
URL: .../4.1.2/
WordPress
машина :)
Трудность 4
Удобство редактирования переводов Это ссылка сразу на
редактирование перевода
Быстрый доступ к редактированию локализаций, их очень много, в админку не налазишься
При нажатии
всплывает окно
Редактор прямо по разметке, самый удобный вариант
API плагина и теги шаблона
Трудность 5 - многообразие API самого WP вынуждает делать множество сходных ф-й

More Related Content

What's hot

Как компилируется программа на С++?
Как компилируется программа на С++?Как компилируется программа на С++?
Как компилируется программа на С++?DEVTYPE
 
БЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир ГриненкоБЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир ГриненкоYandex
 
Стажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IP
Стажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IPСтажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IP
Стажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IPSmartTools
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Форум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, ЯндексФорум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, ЯндексYandex
 
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".Badoo Development
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Yandex
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Yandex
 
ПЛАНОВА РАБОТА
ПЛАНОВА РАБОТАПЛАНОВА РАБОТА
ПЛАНОВА РАБОТАVasil Penchev
 
Владимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-componentsВладимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-componentsYandex
 
Введение в язык программирования Go
Введение в язык программирования GoВведение в язык программирования Go
Введение в язык программирования GoElena Grahovac
 
Структура кода на С++
Структура кода на С++Структура кода на С++
Структура кода на С++DEVTYPE
 
Роман Янковский (Devexperts)
Роман Янковский (Devexperts)Роман Янковский (Devexperts)
Роман Янковский (Devexperts)Ontico
 
Go для python-программистов
Go для python-программистовGo для python-программистов
Go для python-программистовKonstantin Cherkasov
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
История PermLUG
История PermLUGИстория PermLUG
История PermLUGAlexey Fedorov
 

What's hot (18)

Как компилируется программа на С++?
Как компилируется программа на С++?Как компилируется программа на С++?
Как компилируется программа на С++?
 
БЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир ГриненкоБЭМ: новости проектов и последние релизы — Владимир Гриненко
БЭМ: новости проектов и последние релизы — Владимир Гриненко
 
Go и fuse
Go и fuseGo и fuse
Go и fuse
 
Стажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IP
Стажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IPСтажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IP
Стажировка 2016-07-12 02 Денис Нелюбин. Web, HTTP, TCP/IP
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Форум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, ЯндексФорум на полном БЭМ-стеке — Николай Ильченко, Яндекс
Форум на полном БЭМ-стеке — Николай Ильченко, Яндекс
 
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
Доклад Юрия Насретдинова на РИТ++ 2013. "Система перевода в Badoo".
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
 
ПЛАНОВА РАБОТА
ПЛАНОВА РАБОТАПЛАНОВА РАБОТА
ПЛАНОВА РАБОТА
 
Владимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-componentsВладимир Гриненко — Библиотеки блоков bem-core и bem-components
Владимир Гриненко — Библиотеки блоков bem-core и bem-components
 
Введение в язык программирования Go
Введение в язык программирования GoВведение в язык программирования Go
Введение в язык программирования Go
 
Структура кода на С++
Структура кода на С++Структура кода на С++
Структура кода на С++
 
Package maintaining in Debian
Package maintaining in DebianPackage maintaining in Debian
Package maintaining in Debian
 
Роман Янковский (Devexperts)
Роман Янковский (Devexperts)Роман Янковский (Devexperts)
Роман Янковский (Devexperts)
 
Go для python-программистов
Go для python-программистовGo для python-программистов
Go для python-программистов
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
История PermLUG
История PermLUGИстория PermLUG
История PermLUG
 

Similar to Кляшко -

игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решенияВладимир Кожаев
 
Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Oleg Poludnenko
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Anthony Marchenko
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычностьStepan Tanasiychuk
 
Использование Symfony
Использование SymfonyИспользование Symfony
Использование SymfonyMedia Gorod
 
Anton Bolshakov - Joint anti-crime. Open source security
Anton Bolshakov - Joint anti-crime. Open source securityAnton Bolshakov - Joint anti-crime. Open source security
Anton Bolshakov - Joint anti-crime. Open source securityDefconRussia
 
Internationalization and localization of the python applications with gettext...
Internationalization and localization of the python applications with gettext...Internationalization and localization of the python applications with gettext...
Internationalization and localization of the python applications with gettext...Volodymyr Hotsyk
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!PyNSK
 
инструменты веб разработчика
инструменты веб разработчикаинструменты веб разработчика
инструменты веб разработчикаSoftline
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Как автоматизировать рутинные задачи или учимся разговаривать на змеином языке
Как автоматизировать рутинные задачи или учимся разговаривать на змеином языкеКак автоматизировать рутинные задачи или учимся разговаривать на змеином языке
Как автоматизировать рутинные задачи или учимся разговаривать на змеином языкеSQALab
 
Scripting languages
Scripting languagesScripting languages
Scripting languagesLev Panov
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox ExtensionОранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extensionchaykaborya
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...SpbDotNet Community
 

Similar to Кляшко - (20)

игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решения
 
Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
 
Progopedia - OSDN
Progopedia - OSDNProgopedia - OSDN
Progopedia - OSDN
 
Использование Symfony
Использование SymfonyИспользование Symfony
Использование Symfony
 
JPHP
JPHPJPHP
JPHP
 
Anton Bolshakov - Joint anti-crime. Open source security
Anton Bolshakov - Joint anti-crime. Open source securityAnton Bolshakov - Joint anti-crime. Open source security
Anton Bolshakov - Joint anti-crime. Open source security
 
Internationalization and localization of the python applications with gettext...
Internationalization and localization of the python applications with gettext...Internationalization and localization of the python applications with gettext...
Internationalization and localization of the python applications with gettext...
 
Мой Python всегда со мной!
Мой Python всегда со мной!Мой Python всегда со мной!
Мой Python всегда со мной!
 
инструменты веб разработчика
инструменты веб разработчикаинструменты веб разработчика
инструменты веб разработчика
 
лекция 3
лекция 3лекция 3
лекция 3
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Как автоматизировать рутинные задачи или учимся разговаривать на змеином языке
Как автоматизировать рутинные задачи или учимся разговаривать на змеином языкеКак автоматизировать рутинные задачи или учимся разговаривать на змеином языке
Как автоматизировать рутинные задачи или учимся разговаривать на змеином языке
 
лекция 4
лекция 4лекция 4
лекция 4
 
Scripting languages
Scripting languagesScripting languages
Scripting languages
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox ExtensionОранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
 

Кляшко -

  • 1. Трудности перевода: как построить мультиязычный сайт на WordPress
  • 2. Сайт на другом языке (языках) На сайте только один язык? Да Нет Нет Да Локализация → 1 Мультиязычный сайт → 3 Языковые версии сайта → 2 Контент на разных языках должен совпадать
  • 3. Утилита Unix gettext() Источники данных для утилиты gettext() - файлы .mo, скомпилированные “языковые БД” особой структуры То, из чего компилируютя файлы .mo - файлы .po Локализация → 1
  • 4. 1 -> язык 2 -> языка 11345 -> языков языки 4 варианта Особая проблема - мультиязычные формы Работает утилита Unix ngettext() Запись мультиязычной (plural) формы на псевдоязыке в заголовке файла .po Уникальна для каждого языка
  • 5. Альтернатива gettext() - база данных Вызов gettext() в PHP *nix вызывает свою утилиту gettext() Обращение к файлу .mo Работа gettext() в файле .mo по поиску словопары Найдено? отдаем то что найдено Да отдаем оригинал Нет Загрузка страницы Выгрузка из БД всех словопар в виде массива в память Массив словопар [ ] Вызов gettext() в PHP хук gettext() Повышение производительности: нет ни обращения к файловой системе, ни механизма поиска в файле .mo
  • 6. Запись URL мультиязычных сайтов и языковых версий сайта http://site.com/meetup-page/?lang=fi http://site.com/lang/fi/meetup-page/ http://fi.site.com/meetup-page/ RewriteEngine on RewriteCond %{HTTP_HOST} ^fi.site.com RewriteRule ^(.*)$ http://site.com/lang/fi/$1 [L,NC,QSA] Добавление правил в . htaccess позволяет не создавать никаких реальных языковых субдоменов
  • 7. Языковые версии сайта → 2 EN версия сайта в поддиректории URL http://doklad.wpru/en/ Почему такое возможно: .htaccess WP при создании ЧПУ (почти такой же .htaccess в Yii FW)
  • 8. Мультиязычный сайт → 3 Принципы создания - всего два Контент (ru) Тот же контент на другом языке (fi) Параллельный контент в БД Переключение контента в зависимости от URL, в котором содержится язык Создание отдельно переводов Запрос контента Буфер, следящий за URL В URL есть язык? Да Отдаем перевод Нет Отдаем оригинал ф-я обертка над любым контентом _translate()
  • 9. Плагин WPML Это локализация по принципу из БД Основной плагин WPML работает по принципу создания параллельного контента
  • 10. Стили URL - нет варианта с языковым ключом После инсталляции плагина - возможность добавить перевод
  • 11. Оригинал Перевод Локализация в WPML называется перевод строк - отдельный плагин. Делается вручную
  • 12. Те самые параллельные посты Связь поста и перевода в БД в отдельной таблице плагина WPML
  • 13. Локализация в WPML - либо загрузка .mo файлов, либо вручную Это отдельный плагин в составе WPML
  • 14. Наш плагин для создания мультиязычных сайтов One Click Localize -> OCL Трудности перевода :)
  • 15. Русская и английская версия сайта плагина OCL
  • 17. Главная ф-я ядра плагина - ф-я _ocl() (часть 1)
  • 19. Трудность 1 - локализация Первая попытка покорить мир Заливка файлов .po ВСЕХ официальных локализаций WP Приведение псевдокода файлов .po в PHP, разбор словопар Внесение локализаций в БД БД всех официальных локализаций WP, которые есть в мире Это создание PHP из псевдокода для plural вариантов При инсталляции плагина и/или добавлении языков локализации нужных языков вносятся в БД установленного WP
  • 20. Трудность 2 Автоматический перевод _ocl() Запрос к системе автоматического перевода Сервис Сложность работы Платный Что можно переводить Перевод с тегами HTML Yandex Низкая Условно нет, есть неописанное суточное ограничение на число запросов Сайт с малым обновлением контента Да, но требует правки Google Средняя $20 за 2 миллиона знаков 2 млн. знаков - это примерно 1400 страниц среднего размера Да, идеально Bing Высокая $20 за 2 миллиона знаков -//- Да, идеально
  • 21. Трудность 3 Тестирование плагина для разных версий WP Общая БД, разные версии WP имеют разные префиксы 2.8.1 Файлы проинсталлированных версий WP Папка с плагином - символическая ссылка 3.0.1 Папка с плагином - символическая ссылка ... 4.1.2 Папка с плагином - символическая ссылка ... Реальная папка, в которую размещается плагин URL: .../2.8.1/ URL: .../3.0.1/ URL: .../4.1.2/ WordPress машина :)
  • 22. Трудность 4 Удобство редактирования переводов Это ссылка сразу на редактирование перевода
  • 23. Быстрый доступ к редактированию локализаций, их очень много, в админку не налазишься При нажатии всплывает окно
  • 24. Редактор прямо по разметке, самый удобный вариант
  • 25. API плагина и теги шаблона Трудность 5 - многообразие API самого WP вынуждает делать множество сходных ф-й