Перевод: различия между версиями
Kondin (обсуждение | вклад) |
Abushyk (обсуждение | вклад) |
||
(не показано 12 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
+ | == Рекомендуемый быстрый способ перевода сайта == | ||
+ | Вы можете использовать переводчик от Google, тут инструкция https://translate.google.com/manager/website/<br/> | ||
+ | Это самый быстрый способ и не требует от вас дополнительных усилий.<br/> | ||
+ | == Включение языков в настройках == | ||
+ | Использовать мультиязычность (apps.language.use_langs) = '''1'''<br> | ||
+ | Список языков (apps.language.languages) = '''ru=Русский|en=English|ua=Украинский'''<br> | ||
+ | Код языка по умолчанию (apps.language.default_lang_code) = '''ru'''<br> | ||
+ | Использовать технические значения как RU (apps.language.use_default_as_ru) = '''поставить галочку'''<br> | ||
+ | |||
+ | === Перевод значения select_by_query === | ||
+ | |||
+ | При использовании в свойствах объекта полей, которые ссылаются на свои объекты-таблицы (например поле Город в объявлении, которое представляет собой ссылку на объект города) в объект внедряются значения этого связанного объекта. Связь устанавливается в Редакторе форм путем указания таблицы-источника, ключа внешнего объекта и значения, которое будет использоваться в виде текстового представления. | ||
+ | |||
+ | Для мультиязычных сайтов текстовые значения всех объектов должны иметь представления для каждого заявленного языка. Если в настроках Вы указали, что используется три языка - ru, en и es, значит для каждого тектового поля должны присутствовать значения переводов на каждый из них. Это означает, что стандартная модель объекта Город, которая состоит из двух полей city_id и name должна быть расширена еще полями name_en и name_es для хранения аналога текстового значения на английском и испанском. | ||
+ | |||
+ | При получении объекта из базы именно эти поля будут использоваться для получения текстового значения. Другими словами, если у Вас в объявлении есть поле Город, то его название будет браться из полей name_en если текущий язык английский и из name_es, если - испанский. | ||
+ | |||
+ | Но не всегда это необходимо. Если Вы используете названия городов на английском и Вам нет необходимости переводить их для других языков, так как англоязычные название более узнаваемы и приемлемы, то вы можете не создавать аналоги названий для других языков. Но в таком случае необходимо добавить параметр '''no_ml''' со значением 1 в каждое свойство всех моделей, которое ссылается на эту таблицу, чем просигнализировать системе, что нет необходимости искать языковой аналог для этого поля, а можно использовать одно единственное значение из name для всех языков. | ||
+ | |||
+ | == Ручной перевод == | ||
Для того чтобы перевести пункты меню необходимо для каждого элемента в меню добавить соответствующие языковые значения. Доступно с версии системы 2.6.7<br /> | Для того чтобы перевести пункты меню необходимо для каждого элемента в меню добавить соответствующие языковые значения. Доступно с версии системы 2.6.7<br /> | ||
+ | |||
+ | Для активации мультиязычного режима нужно включить в настройках во вкладке Редактор переводов опцию Использовать мультиязычность (apps.language.use_langs) - установите там значение 1.<br/> | ||
Для того чтобы перевести текстовое описание в объявлении, нужно добавить поле описания с префиксом языка.<br /> | Для того чтобы перевести текстовое описание в объявлении, нужно добавить поле описания с префиксом языка.<br /> | ||
Строка 7: | Строка 29: | ||
Однако, система будет использовать это поле, для того чтобы найти значение для text в другом языке, если этот язык сейчас активен. И если такое значение найдено, то будет выполнена операция перезаписи значения text=text_en.<br /> | Однако, система будет использовать это поле, для того чтобы найти значение для text в другом языке, если этот язык сейчас активен. И если такое значение найдено, то будет выполнена операция перезаписи значения text=text_en.<br /> | ||
Благодаря этому, мы получим перевод для описания объявления при просмотре его на сайте на другом языке, отличном от русского. | Благодаря этому, мы получим перевод для описания объявления при просмотре его на сайте на другом языке, отличном от русского. | ||
+ | |||
+ | === Локализации === | ||
+ | Языки подключаются в два этапа - этап локализации системы и этап локализации приложения | ||
+ | |||
+ | ==== Этап локализации системы ==== | ||
+ | Языки подключаются в систему динамически. Фактически, признаком установленного языка является наличие языковой папки со словарями размещенной в /apps/system/language.<br /> | ||
+ | |||
+ | В этой папке размещаются языковые директории вида ru, en, cn. Каких-то особых ограничений на название языковой папки нет, кроме того, что ее название должно состоять только из латински букв от a до z. Логичнее всего обозначать их по кодам языков согласно ISO 639-1.<br /> | ||
+ | |||
+ | Данная языковая папка содержит один файл - dictionary.ini, который описывает переводы языковых переменных. Если вам необходимо добавить новый язык, просто добавьте соответствующую языковую папку, скопируйте в нее dictionary.ini из папки ru и переведите значения на нужный язык.<br /> | ||
+ | |||
+ | |||
+ | ==== Этап локализации приложения ==== | ||
+ | Приложения локализируются схожим образом. Единственным отличием является то, что языковые файлы хранятся в папке приложения. | ||
+ | Языковой папкой приложения является /apps/приложение/language. В ней располагаются языковые папки локализаций, которые должны соответствовать папкам в системной языковой папке /apps/system/language.<br /> | ||
+ | |||
+ | Эта папка содержит так же файл dictionary.ini идентичны по смыслу и функционалу со словарем системы, но описываются в нем только свойственные именно этому приложению языковые переменные | ||
+ | |||
+ | ==== Редактор языков в админке ==== | ||
+ | В новых версиях создан редактор языков в панели управления '''Приложения - Редактор переводов''' | ||
+ | |||
+ | ==== Необходимые изменения в базе данных ==== | ||
+ | Когда вы добавляете свой язык, вам необходимо добавить дополнительные поля в базе данных с помощью этих команд:<br /> | ||
+ | alter table re_topic add column name_яз varchar(255);<br /> | ||
+ | alter table re_menu_structure add column name_яз varchar(255);<br /> | ||
+ | Где яз - это ваш языковой префикс. Например, если вы добавили японский язык, тогда яз = jp<br /> | ||
+ | <br /> | ||
+ | ==== Перевод шаблонов ==== | ||
+ | <br/> | ||
+ | Для того чтобы создавать языковые файлы в шаблоне, необходимо создать каталог в шаблоне<br/> | ||
+ | /template/frontend/ваш_шаблон/language/ru/dictionary.ini (для русского языка)<br/> | ||
+ | /template/frontend/ваш_шаблон/language/en/dictionary.ini (для английского языка)<br/> | ||
+ | <br/> | ||
+ | Вот пример dictionary.ini для русского языка<br/> | ||
+ | LT_NEWS="Новости" | ||
+ | LT_FOR_USER="Пользователю" | ||
+ | LT_USEFUL="Полезное" | ||
+ | LT_SPECIAL="Спецпредложение" | ||
+ | LT_WE_OFFER="Мы предлагаем" | ||
+ | LT_LIST="Список" | ||
+ | LT_GRID="Сетка" | ||
+ | LT_ORDER="Порядок" | ||
+ | LT_SORTBY="Сортировать" | ||
+ | LT_ORDER_UP="по возрастанию" | ||
+ | LT_ORDER_DOWN="по убыванию" | ||
+ | LT_SEARCH="Поиск" | ||
+ | LT_VIEW_DETAILS="Подробнее" | ||
+ | LT_CONTACT_AGENT="Связаться с агентом" | ||
+ | LT_DESCRIPTION="Описание" | ||
+ | LT_LOCATION="Расположение" | ||
+ | LT_ADD_YOUR_OWN="Добавить свое объявление" | ||
+ | LT_ADD_YOUR_OWN_DESC="На нашем сайте вы можете добавить информацию о своей недвижимости" | ||
+ | LT_SCROLLUP="Наверх" | ||
+ | LT_RENT_FLAT="Снять квартиру" | ||
+ | LT_RENT_FLAT_DESC="Интересно арендовать, тогда заполните форму и мы подберем вам вариант" | ||
+ | LT_MORTGAGES="Ипотека" | ||
+ | LT_MORTGAGES_DESC="Быстро оформить ипотеку и жить в своей квартире, это проще чем думается." | ||
+ | LT_SEARCH="Поиск" | ||
+ | LT_NEW_OBJECTS="Новые объекты" | ||
+ | LT_CONTACTUS="Написать нам" | ||
+ | LT_ABOUT="О нас" | ||
+ | Теперь внутри шаблона, например, в файле спец.предложений можно заменить слово Спец.предложения на языковую переменную, которая будет переводиться в соответствии с выбранным языком<br/> | ||
+ | /template/frontend/ваш_шаблон/top_special.tpl<br/> | ||
+ | Меняем слово Спец.предложения на {$L_SPECIAL_OFFERS}<br/> | ||
+ | Обсудить на форуме https://www.sitebill.ru/s/topic/3345-%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4-%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2/ | ||
+ | <br /> | ||
+ | ==== Функции перевода в коде PHP и шаблонах TPL ==== | ||
+ | <br/> | ||
+ | В коде PHP вместо выражений типа '''$title = "Заголовок";''' следует исползовать такое выражение '''$title = _e('Заголовок');'''<br /> | ||
+ | |||
+ | Функция '''_e(string)''' - в случае если в настройках CMS не включены языки, то она просто вернет себя же при минимальном расходе ресурсов. Если же у нас включены языки, то эта функция сгенерирует md5-сумму данного слова и сделает запрос в базу на наличие перевода для текущего языка. Если этот перевод в хэш-таблице имеется, то будет возвращено переведенный текст. Если же в таблице переводов еще нет текста для этой md5-суммы, то при включенной опции '''apps.language.google_translate_api_key''' будет выполнена попытка перевода фразы с использованием Google translate API https://cloud.google.com/translate/docs/ | ||
+ | После успешного перевода, в таблицу записывается перевод для этой фразы и возвращается результатом из функции '''_e(string)'''.<br /><br /> | ||
+ | |||
+ | |||
+ | Аналогичным образом в шаблонах эта функция переопределана для использования в TPL файлах smarty '''{_e t="Привет мир!"}''' - этот код выведет перевод на выбранный язык или же просто выдаст эту же строчку, без включенного перевода. |
Текущая версия на 11:49, 24 июня 2019
Содержание
Рекомендуемый быстрый способ перевода сайта
Вы можете использовать переводчик от Google, тут инструкция https://translate.google.com/manager/website/
Это самый быстрый способ и не требует от вас дополнительных усилий.
Включение языков в настройках
Использовать мультиязычность (apps.language.use_langs) = 1
Список языков (apps.language.languages) = ru=Русский|en=English|ua=Украинский
Код языка по умолчанию (apps.language.default_lang_code) = ru
Использовать технические значения как RU (apps.language.use_default_as_ru) = поставить галочку
Перевод значения select_by_query
При использовании в свойствах объекта полей, которые ссылаются на свои объекты-таблицы (например поле Город в объявлении, которое представляет собой ссылку на объект города) в объект внедряются значения этого связанного объекта. Связь устанавливается в Редакторе форм путем указания таблицы-источника, ключа внешнего объекта и значения, которое будет использоваться в виде текстового представления.
Для мультиязычных сайтов текстовые значения всех объектов должны иметь представления для каждого заявленного языка. Если в настроках Вы указали, что используется три языка - ru, en и es, значит для каждого тектового поля должны присутствовать значения переводов на каждый из них. Это означает, что стандартная модель объекта Город, которая состоит из двух полей city_id и name должна быть расширена еще полями name_en и name_es для хранения аналога текстового значения на английском и испанском.
При получении объекта из базы именно эти поля будут использоваться для получения текстового значения. Другими словами, если у Вас в объявлении есть поле Город, то его название будет браться из полей name_en если текущий язык английский и из name_es, если - испанский.
Но не всегда это необходимо. Если Вы используете названия городов на английском и Вам нет необходимости переводить их для других языков, так как англоязычные название более узнаваемы и приемлемы, то вы можете не создавать аналоги названий для других языков. Но в таком случае необходимо добавить параметр no_ml со значением 1 в каждое свойство всех моделей, которое ссылается на эту таблицу, чем просигнализировать системе, что нет необходимости искать языковой аналог для этого поля, а можно использовать одно единственное значение из name для всех языков.
Ручной перевод
Для того чтобы перевести пункты меню необходимо для каждого элемента в меню добавить соответствующие языковые значения. Доступно с версии системы 2.6.7
Для активации мультиязычного режима нужно включить в настройках во вкладке Редактор переводов опцию Использовать мультиязычность (apps.language.use_langs) - установите там значение 1.
Для того чтобы перевести текстовое описание в объявлении, нужно добавить поле описания с префиксом языка.
Например, нужно сделать перевод для поля text (описание) на английский язык (en).
Заходим в редактор форм и там добавляем поле с типом textarea_editor и системным названием text_en.
В поле доступно для групп указываем группу Администраторы. Этим мы добьемся того, что посетители сайта не будут видеть дублей полей на разных языках, т.е. гость не увидит поля text_en.
Однако, система будет использовать это поле, для того чтобы найти значение для text в другом языке, если этот язык сейчас активен. И если такое значение найдено, то будет выполнена операция перезаписи значения text=text_en.
Благодаря этому, мы получим перевод для описания объявления при просмотре его на сайте на другом языке, отличном от русского.
Локализации
Языки подключаются в два этапа - этап локализации системы и этап локализации приложения
Этап локализации системы
Языки подключаются в систему динамически. Фактически, признаком установленного языка является наличие языковой папки со словарями размещенной в /apps/system/language.
В этой папке размещаются языковые директории вида ru, en, cn. Каких-то особых ограничений на название языковой папки нет, кроме того, что ее название должно состоять только из латински букв от a до z. Логичнее всего обозначать их по кодам языков согласно ISO 639-1.
Данная языковая папка содержит один файл - dictionary.ini, который описывает переводы языковых переменных. Если вам необходимо добавить новый язык, просто добавьте соответствующую языковую папку, скопируйте в нее dictionary.ini из папки ru и переведите значения на нужный язык.
Этап локализации приложения
Приложения локализируются схожим образом. Единственным отличием является то, что языковые файлы хранятся в папке приложения.
Языковой папкой приложения является /apps/приложение/language. В ней располагаются языковые папки локализаций, которые должны соответствовать папкам в системной языковой папке /apps/system/language.
Эта папка содержит так же файл dictionary.ini идентичны по смыслу и функционалу со словарем системы, но описываются в нем только свойственные именно этому приложению языковые переменные
Редактор языков в админке
В новых версиях создан редактор языков в панели управления Приложения - Редактор переводов
Необходимые изменения в базе данных
Когда вы добавляете свой язык, вам необходимо добавить дополнительные поля в базе данных с помощью этих команд:
alter table re_topic add column name_яз varchar(255);
alter table re_menu_structure add column name_яз varchar(255);
Где яз - это ваш языковой префикс. Например, если вы добавили японский язык, тогда яз = jp
Перевод шаблонов
Для того чтобы создавать языковые файлы в шаблоне, необходимо создать каталог в шаблоне
/template/frontend/ваш_шаблон/language/ru/dictionary.ini (для русского языка)
/template/frontend/ваш_шаблон/language/en/dictionary.ini (для английского языка)
Вот пример dictionary.ini для русского языка
LT_NEWS="Новости" LT_FOR_USER="Пользователю" LT_USEFUL="Полезное" LT_SPECIAL="Спецпредложение" LT_WE_OFFER="Мы предлагаем" LT_LIST="Список" LT_GRID="Сетка" LT_ORDER="Порядок" LT_SORTBY="Сортировать" LT_ORDER_UP="по возрастанию" LT_ORDER_DOWN="по убыванию" LT_SEARCH="Поиск" LT_VIEW_DETAILS="Подробнее" LT_CONTACT_AGENT="Связаться с агентом" LT_DESCRIPTION="Описание" LT_LOCATION="Расположение" LT_ADD_YOUR_OWN="Добавить свое объявление" LT_ADD_YOUR_OWN_DESC="На нашем сайте вы можете добавить информацию о своей недвижимости" LT_SCROLLUP="Наверх" LT_RENT_FLAT="Снять квартиру" LT_RENT_FLAT_DESC="Интересно арендовать, тогда заполните форму и мы подберем вам вариант" LT_MORTGAGES="Ипотека" LT_MORTGAGES_DESC="Быстро оформить ипотеку и жить в своей квартире, это проще чем думается." LT_SEARCH="Поиск" LT_NEW_OBJECTS="Новые объекты" LT_CONTACTUS="Написать нам" LT_ABOUT="О нас"
Теперь внутри шаблона, например, в файле спец.предложений можно заменить слово Спец.предложения на языковую переменную, которая будет переводиться в соответствии с выбранным языком
/template/frontend/ваш_шаблон/top_special.tpl
Меняем слово Спец.предложения на {$L_SPECIAL_OFFERS}
Обсудить на форуме https://www.sitebill.ru/s/topic/3345-%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4-%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2/
Функции перевода в коде PHP и шаблонах TPL
В коде PHP вместо выражений типа $title = "Заголовок"; следует исползовать такое выражение $title = _e('Заголовок');
Функция _e(string) - в случае если в настройках CMS не включены языки, то она просто вернет себя же при минимальном расходе ресурсов. Если же у нас включены языки, то эта функция сгенерирует md5-сумму данного слова и сделает запрос в базу на наличие перевода для текущего языка. Если этот перевод в хэш-таблице имеется, то будет возвращено переведенный текст. Если же в таблице переводов еще нет текста для этой md5-суммы, то при включенной опции apps.language.google_translate_api_key будет выполнена попытка перевода фразы с использованием Google translate API https://cloud.google.com/translate/docs/
После успешного перевода, в таблицу записывается перевод для этой фразы и возвращается результатом из функции _e(string).
Аналогичным образом в шаблонах эта функция переопределана для использования в TPL файлах smarty {_e t="Привет мир!"} - этот код выведет перевод на выбранный язык или же просто выдаст эту же строчку, без включенного перевода.