Перевод: различия между версиями

Материал из CMS Sitebill Wiki
Перейти к навигации Перейти к поиску
(Новая страница: «Для того чтобы перевести пункты меню необходимо для каждого элемента в меню добавить со…»)
 
 
(не показано 13 промежуточных версий 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/>
Например, нужно сделать перевод для поля text (описание) на английский язык (en).
+
 
Заходим в редактор форм и там добавляем поле с типом textarea_editor и системным названием text_en.
+
Для того чтобы перевести текстовое описание в объявлении, нужно добавить поле описания с префиксом языка.<br />
В поле доступно для групп указываем группу Администраторы. Этим мы добьемся того, что посетители сайта не будут видеть дублей полей на разных языках, т.е. гость не увидит поля text_en.
+
Например, нужно сделать перевод для поля text (описание) на английский язык (en).<br />
Однако, система будет использовать это поле, для того чтобы найти значение для text в другом языке, если этот язык сейчас активен. И если такое значение найдено, то будет выполнена операция перезаписи значения text=text_en.
+
Заходим в редактор форм и там добавляем поле с типом textarea_editor и системным названием text_en.<br />
 +
В поле доступно для групп указываем группу Администраторы. Этим мы добьемся того, что посетители сайта не будут видеть дублей полей на разных языках, т.е. гость не увидит поля 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="Привет мир!"} - этот код выведет перевод на выбранный язык или же просто выдаст эту же строчку, без включенного перевода.