Привет, Гость!
Главная
Вход

Последняя активность

Форум / JohnCMS / Инструкции
Поиск
  JohnCMS | Переход на Gettext, мануал для разработчиков
1 2 >>
AlkatraZ AlkatraZ (SV!) [Off] [#] (14.09.2016 / 22:43)
╭∩╮ (`-`) ╭∩╮
Как Вы знаете, JohnCMS сменил формата языков, то есть той системы, которая реализует многоязычность.
Ранее в JohnCMS для реализации многоязычности использовались .ini файлы, в которых хранились языки в формате ключ=>фраза. Эти файлы потом считываются системой и парсятся в PHP массив, который и доступен для применения в виде переменной $lng.
Мультиязычность была реализована еще в далеком 2010 году.

Однако время идет и появились отличные онлайн сервисы (к примеру Crowdin, Transifex и другие) и программы, которые очень сильно помогают разработчикам с переводом, систематизируют и упорядочивают их работу, позволяют избежать ошибок.
Работа с ключами массивов, несмотря на свою очевидность, в большом проекте превращается в реальный геморой.
Требовалось какое-то решение проблемы.

Прежде всего я исследовал возможности онлайн сервисов, программ, почитал кучу статей на тему как сегодня решается вопрос интернационализации (i18n) в современных программах.
Да, формат PHP array поддерживается многими сервисами перевода (в частности Crowdin), но хотелось чего-то более удобного и очевидного.
Сразу же натолкнулся на наиболее растространенное средство (для всех языков программирования) интернационализации - это GNU Gettext.
Данное расширение существует и для PHP, формат Gettext используется во многих популярных проектах, например Wordpress.
Несмотря на кажущуюся (по сравнению с PHP array) сложность самих языковых файлов, на деле данный формат дает большое удобство и предоставляет много возможностей для разработчика.
===
Обсудить статью и задать вопросы можно тут: JohnCMS | Переход на Gettext
AlkatraZ AlkatraZ (SV!) [Off] [#] (14.09.2016 / 22:44)
╭∩╮ (`-`) ╭∩╮
КРАТКОЕ ЗНАКОМСТВО С GETTEXT
Я не буду описывать подробности, статей на эту тему есть куча, поищите в интернете на предмет "gettext".
Можете так же поискать мануалы для переводчиков Wordpress, там тоже используется данный формат и многие мануалы могут быть полезными для понимания системы.

Расскажу как хранятся языки.

Если Вы загляните в папку с языками любого модуля, то увидите там файлы с расширениями .PO и .MO
Это и есть наше хранилище фраз с переводами.

Файлы .PO представляют из себя обычные текстовые файлы, в которых хранятся фразы в исходном виде (исходник).
В файле есть заголовок со служебными инструкциями и собственно фразы.
msgid - это фраза на исходном языке (в нашем случае на Английском)
msgstr - это уже переведенная фраза
В файле так же много комментариев с указанием, где в PHP исходнике встречается данная фраза. Именно с этими файлами и работают переводчики.
Однако сегодня их никто вручную не переводит, для этого есть удобные онлайн-сервисы и специальные редакторы (к примеру PoEdit)

Файлы .MO это скомпилированный в машинный формат .PO файл. Данные хнанятся в бинарном виде, потому посмотреть содержимое в текстовом редакторе невозможно.

Файлы .POT Еще Вы можете заметить, что у нас имеются файлы с расширением .POT
Это шаблоны с исходными фоарами. Перевода там нет.
Данные файлы формируются автоматически. Фразы извлекаются из исходного РНР куода с помощью специавльных утилит (опишу ниже).
После, данный файл загружается на онлайн-сервис перевода, или открывается в редакторе PoEdit и на его основе формируются .PO заготовки для всех языков.
Изм. AlkatraZ (27.03.2017 / 20:54) [5]
AlkatraZ AlkatraZ (SV!) [Off] [#] (21.09.2016 / 12:39)
╭∩╮ (`-`) ╭∩╮
Я понимаю, что всем инересно почитать о том, как на практике работать Gettext. Инструкции будут, но позже. Перед этим надо рассказать про реализацию мультиязычности в JohnCMS.

РЕАЛИЗАЦИЯ
Тут все довольно просто.
Вы пишите свой скрипт, там где в браузер должна выводиться какая-то информация, которую потом нужно переводить на другие языки, Вы применяете функцию _t() в которую в качестве аргумента вставляете нужную фразу.
Пример:
echo _t('Welcome');
Функция _t() займется переводом переданного ей текста. Если перевода не существует (ну не успели еще сделать), то будет показана исходная фраза.

Еще есть возможность плюрализации, то есть использования множественных чисел, например: 1 файл, 2 файла, 5 файлов.
Но об этом потом.

Примечание
Хотя в качестве исходного "системного" языка можно использовать любой, международный стандарт подразумевает, что для Gettext исходным языком является Английский.
В JohnCMS в качестве исходного тоже используется Английский. Это необходимо учитывать при разработке мультиязычных модулей.
Изм. AlkatraZ (21.09.2016 / 12:40) [1]
AlkatraZ AlkatraZ (SV!) [Off] [#] (21.09.2016 / 13:03)
╭∩╮ (`-`) ╭∩╮
ПРАКТИЧЕСКОЕ РУКОВОДСТВО: СТРУКТУРА
Каждый модуль JohnCMS имеет свои языковые файлы. Несмотря на некоторое дублирование фраз, достигается полная языковая независимость.
Несмотря на то, что вы можете располагать языковые файлы так, как Вам удобно, в JohnCMS существуют свои рекомендацити для этого:
/папка_с_модулем/locale/двухбуквенный_ISO_код/default.po (ну и там же скомпилированный default.mo)

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


ПРАКТИЧЕСКОЕ РУКОВОДСТВО: ИНСТРУМЕНТЫ
Для начала, нам понадобится специальный инструмент (читай редактор) для работы с Gettext.
Для этого лезем сюда: https://poedit.net и скачиваем бесплатный редактор PoEdit.
Устанавливаем его, благо, что он существует для Windows, Linux и MacOs.

У PoEdit есть много полезных наворотов, помогающих переводчикам. С этим разберетесь сами.
Сейчас мы поговорим о другой его возможности: автоматическое извлечение фраз из исходного кода.
Но об этом ниже.

Желающие разумеется могут установить нужные библиотеки и использовать интерфейс коммандной строки утилит Gettext, но данное направление тут рассматривать не будем, кому нужно сами разберутся.
Изм. AlkatraZ (22.09.2016 / 11:56) [1]
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 11:55)
╭∩╮ (`-`) ╭∩╮
ПРАКТИЧЕСКОЕ РУКОВОДСТВО: НАПИСАНИЕ КОДА
Для примера будем рассматривать модуль альбомов.
Подразумевается, что у нас пороцедурный код. Любители ООП могут данную часть подробно не читать, у них есть свои возможности прямой связи с контейнером и пакетом i18n.

В первую очередь Вам надо сообщить движку, откуда в Вашем модуле берется перевод и каков его формат. Поддерживаются форматы gettext, phparray, ini (нужное значение передается в виде аргумента).
Для этого вставляем в свой код ПОСЛЕ(!!!) подключения require('../incfiles/core.php') следующие строки:
  1. /** @var Interop\Container\ContainerInterface $container */
  2. $container = App::getContainer();
  3. /** @var Zend\I18n\Translator\Translator $translator */
  4. $translator = $container->get(Zend\I18n\Translator\Translator::class);
  5. $translator->addTranslationFilePattern('gettext', __DIR__ . '/locale', '/%s/default.mo');

В данном коде мы в начале получаем объект контейнера $container, а далее от него требуем объект транслятора, чтоб потом сообщить ему откуда брать файлы пеервода.
Последняя строка нашего куска кода (метод addTranslationFilePattern()) как раз этим и занимается. Первым аргументом мы передаем тип файлов с фразами (gettext, phparray, ini), а вторым аргументом патерн поиска файлов с фразами.
Если используете формат Gettext и следуете рекомендациям по структуре, то просто скопируйте код как есть.

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

Ну а далее все просто...
Пишете свой код в Вашем любимом РНР редакторе, все фразы, которые нужно выводить в браузер и которые нужно перевести на другие языки, заключаете в функцию _t()
Про плюрализацию и варианты множественных чисел напишу отдельно.
Изм. AlkatraZ (22.09.2016 / 12:34) [3]
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 12:34)
╭∩╮ (`-`) ╭∩╮
ПРАКТИЧЕСКОЕ РУКОВОДСТВО: ПОДГОТОВКА К ПЕРЕВОДУ
Вот мы и подошли к главной части нашего мануала.
Если выше все сделали правильно, то у Вас код должен работать без проблем и фразы будут выводиться на исходном (Английском) языке, даже если Вы пока еше не создали никаких файлов с фразами перевода.
Вот этим мы сейчас и займемся.

СОЗДАЕМ ШАБЛОН ДЛЯ ПЕРЕВОДА
Так, как у нас подразумевается большое к-во различных языков и использование онлайн сервисов перевода, удобнее будет создать шаблон Gettext, как вы помните, это файл с расширением .pot
Чтоб не заморачиваться с созданием нового файла, проще скопировать его с другого модуля и настроить под себя.
Так, как у нас исходный язык Английский, в его папке (en) у нас и будет храниться шаблон.

1) В папке с Вашим модулем создаем подпапки ./locale/en/
Полный путь от корня движка может выглядеть так /mymodule/locale/en/

2) так, как в качестве примера мы рассматривали альбомы, лезем в папку /album/locale/en/ и видим там файл default.pot
Это и есть шаблон, копируем его в свою папку /mymodule/locale/en/, что мы создали выше.

3) Запускаем редактор PoEdit и открываем наш файл шаблона /mymodule/locale/en/default.pot
Вы сразу же увидите набор фраз исходного языка. Однако, так, как мы скопировали шаблон из другого модуля, там пока не наши фразы, а чужие.
Чтоб там появились именно наши фразы, нам надо настроить наш шаблон на извлечение фраз по нужному нам пути (из папки с нашим модулем).

4) Заходим в меню poEdit "Каталог -> Свойства"
Откроется окно, где будет 3 вкладки.
Первая вкладка нас не интересует, если Вы пишете не оф. модуль, а какой-то свой, можете вписать туда свои реквизиты. Главное не трогайте настройки кодировки. Должно быть UTF-8.

Нас интересует вторая вкладка "Папки с исходными файлами", переходим на нее.
Так, как мы скопировали наш шаблон из другого модуля, там будут прописаны именно его пути. Нужно их удалитьл и добавить свой.
В поле "Папки" Вы увидите точку. Выделите ее и ниже нажмите минус, чтоб удалить.
Далее, рядом жмите плюс и выберите пункт "Добавить папки". Укажите там корневую папку своего модуля.

Для интересу можете заглянуть в последнюю вкладку. там указываются те функции, которые ответственны за перевод и из которых потом будут извлекаться фразы.
В нашем случае это функции _t() и _p(), они и указаны. Посему, там ничего не трогаете.

На этом все. Жмем ОК и окно свойств закроется.

5) В панели редактора жмите кнопку "Сохранить", чтоб зафиксировать изменения в нашем шаблоне.
Наш шаблон успешно подготовлен к извлечению фраз.

6) На панели инструментов poEdit жмем кнопку "Обновить".
Запустится тот самый волшебный и удобный процесс по извлечению фраз из исходного кода.
Все старые фразы от чужого модуля удалятся.
Если вы уже успели написать что-то свое и сделали это правильно, в окне редактора появятся фразы именно вашего модуля.

7) Сохраняем наш шаблон.
Изм. AlkatraZ (22.09.2016 / 14:33) [4]
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 12:46)
╭∩╮ (`-`) ╭∩╮
ПРАКТИЧЕСКОЕ РУКОВОДСТВО: ПРОВЕРКА И АКТУАЛИЗАЦИЯ
Если выше все сделали правильно, у нас в папке /mymodule/locale/en/ будет находиться файл default.pot с фразами нашего модуля.
Еще раз откройте его в редакторе PoEdit и внимательно просмотрите.
Если заметили какие-то грамматические ошибки, или дублирующийся код (к примеру File и file рассматриваются как разные фразы) исправьте.

ИСПРАВЛЕНИЕ ОШИБОК
УЧТИТЕ, что сам шаблон нельзя редактировать, он у нас обновляется автоматом, любые изменения потом потеряются.
Если заметили какую-то ошибку, жмите на этой строке правой клавишей.
В открывшемся контекстном меню будет пункт "Ссылки:" где будут указаны все строки вашего кода, где встречается данная фраза.
Откройте свой РНР редактор и исправьте фразы в найденных выше строках.

АКТУАЛИЗАЦИЯ
Шаблон с фразами у нас уже был создан. Но сам исходный код постоянно меняется, дополняется и исправляются найденные ошибки.
Шаблон надо постоянно держать в актуальном состоянии с самыми свежими фразами.
Это делается легко. Открываем шаблон и жмем кнопку "Обновить", потом "Сохранить" и все.

(продолжение следует)
Изм. AlkatraZ (22.09.2016 / 12:48) [2]
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 13:14)
╭∩╮ (`-`) ╭∩╮
ПРАКТИЧЕСКОЕ РУКОВОДСТВО: ПЕРЕВОД
Ну и теперь наконец мы подошли собственно к переводу.
Дальнейшие шаги зависят от того, как вы собираетесь переводить Ваш модуль?

ПЕРЕВОД С ПОМОЩЬЮ ОНЛАЙН СЕРВИСОВ
Мы берем наш готовый и проверенный .pot файл и пересылаем его менеджеру проекта, он добавляет его в список файлов для перевода.
после этого все желающие (если проект открытый) могут его переводить.
Готовый результат (.po файлы для всех языков) можно будет скачать исходя из правил конкретного сервиса.

ПЕРЕВОД С ПОМОЩЬЮ POEDIT
Если Вы пишете свой собственный модуль, который не входит в оф. пакет и не желаете пользоваться онлайн сервисами, хорошим решением будет использование для перевода нашего редактора PoEdit.
Для примера, делаем перевод с Английского (исходник) на Русский

1) Подготавливаем папку для нашего языка.
Все языки у нас хранятся в папке /mymodule/locale/, там уже есть папка /en с шаблоном.
Создаем еще одну (локаль), для нашего языка /ru.
ВНИМАНИЕ!!!
Имена папок локалей должны соответствовать двухбуквенному стандарту ISO 639-1
Любая отсебятина обречена на провал, ваш язык просто не будет опознаваться системой.

2) Открываем пустой PoEdit (не открывая никакой файл)

3) В центре окна редактора жмем кнопку "Создать новый перевод" и выбираем файл с нашим шаблоном, что мы создали выше /mymodule/locale/en/default.pot

4) После выбора файла и нажатия кнопки "Открыть", появится окошко с выбором нужного языка для перевода.
Выбираем нужный язык и жмем "ОК"

5) Сохраняем наш перевод в папке для выбранного языка /mymodule/locale/ru/ которую мы создали выше.
УЧТИТЕ, что по умолчанию PoEdit будет предлагать сохранить файл с именем ru.pot Вам же надо сменить имя у сохраняемого файла на default.pot
Если помните, выше мы добавляли некоторый код, где была строка
  1. $translator->addTranslationFilePattern('gettext', __DIR__ . '/locale', '/%s/default.mo');

Так вот, имя файла должно быть как там, только с расширением .po

6) Ну и далее, можно переводить. Если вы подключены к Интернету, то в PoEdit справа сразу же сможете увидеть варианты перевода.
Изм. AlkatraZ (22.09.2016 / 13:25) [1]
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 13:26)
╭∩╮ (`-`) ╭∩╮
ПРАКТИЧЕСКОЕ РУКОВОДСТВО: КОМПИЛЯЦИЯ .MO
Итак, в примере выше Вы перевели свой модуль на Русский.
Однако в браузере Ваш модуль почему то до сих пор разговаривает на Английском, хотя весь остальной движок исправно общается на Русском.
Заключительным этапом нам надо скомпилировать .mo файл, из которгого собственно и берется перевод.

1) Открываем с помощью PoEdit .po файл выбранного языка (файлы шаблонов .pot компилироватьнельзя).
В нашем уроке - это будет созданный выше /mymodule/locale/ru/default.po

2) В меню "Файл" выбираем команду "Компилировать в формат MO..."
Сохраняем файл в той же папке, где лежал исходный .po файл, выбранный для компиляции.
В нашем случае должен получиться /mymodule/locale/ru/default.mo

И все.
Если теперь из браузера откроете свой модуль, он будет говорить на Русском (разумеется те фразы. которые перевели).

ПРИМЕЧАНИЕ
Во время компиляции, PoEdit может показать какие-то ошибки, допущенные при переводе.
Обычно это или лишние переводы строк, или пропущенные плейсхолдеры, или что-то еще.
В этом случае исправляете перевод нужных строк (не исходный текст, а именно перевод) и пробуете скомпилировать еще раз.
Повторяете процесс до тех пор. пока компиляция не будет проходить без ошибок.
Изм. AlkatraZ (22.09.2016 / 14:18) [2]
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 13:26)
╭∩╮ (`-`) ╭∩╮
На этом все.
Тему открываю, если есть вопросы, можете задавать ниже.
За флуд, холивар, или вопрос не по теме - сразу отпуск.
Для трепа по соседству есть другая тема
Тут только мануал.
Изм. AlkatraZ (22.09.2016 / 13:27) [1]
Koenig Koenig (Adm) [Off] [#] (22.09.2016 / 13:36)
(\/)____o_O____(\/)
AlkatraZ, сколько нужно переводов по умолчанию, русский и английский?
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 13:44)
╭∩╮ (`-`) ╭∩╮
# Koenig (22.09.2016 / 13:36)
AlkatraZ, сколько нужно переводов по умолчанию, русский и английский?
Если пишешь оф. модуль, как в твоем случае, тебе нужен только сам шаблон.
Далее, кидаешь его мне, я загружаю его на Crowdin и там уже переводим на все языки, что у нас есть.

Однако для тестирования, чтоб "пощупать", можешь немного перевести сам себе на русский, с помощью PoEdit. Только не заливай результаты в репозиторий!
Официально от тебя нужна только доработка исходного кода и .pot шаблон.
===
Ну а для собственных модулей, сколько языков асилите, на столько и переводите.
Если перевода нет, будет выводиться исходная фраза на Английском.
Изм. AlkatraZ (22.09.2016 / 14:16) [2]
AlkatraZ AlkatraZ (SV!) [Off] [#] (22.09.2016 / 13:46)
╭∩╮ (`-`) ╭∩╮
ПРИМЕЧАНИЕ
Если пишете СВОЙ модуль, который не претендует на включение в оф. релиз, то в качестве исходного можете использовать любой язык. с которым вам комфортно работать, а уж потом переводить на другие языки.

ПРИМЕЧАНИЕ 2
Если не планируете пользоваться онлайн сервисами и число языков, на которые будете переводить невелико, то создавать .POT шаблоны не обязательно. С помощью PoEdit Вы можете создавать сразу .PO файлы для нужного языка. Единственное, надо правильно настроить каталог, указав там UTF-8 кодировку, расположение файлов и функцию перевода.

ПРИМЕЧАНИЕ 3
Для OpenSource проектов, на большинстве онлайн сервисов перевода предусмотрены полнофункциональные бесплатные экаунты. Главное, чтоб Ваш проект (модуль) имел открытый репозиторий (к примеру на Гитхабе) и находился под одной из свободных лицензий https://opensource.org/licenses/category
Текст лицензии должен находиться с исходным кодом.

Если условия соблюдаются, тогда, к примеру, создаете экаунт на Crowdin, отправляете им заявку (там предусмотрена форма) на openSource, где указываете ссылку на свой репозиторий. В течение суток Вам придет ответ и экаунт будет переведен на полный режим.
Изм. AlkatraZ (24.09.2016 / 22:44) [4]
ramzes ramzes [Off] [#] (23.10.2016 / 20:47)
Альк, Чутка поофтоплю.
Глянь небольшой кодик, правильно ли я понял реализацию плюрализации?
  1. // _plural(12, 'authors');
  2.  
  3. public function _plural($int, $key)
  4. {
  5.  
  6. if($this->words==false){
  7. $this->content();
  8. }
  9.  
  10. $num = $int%100;
  11. if ($num>19) {
  12. $num = $num%10;
  13.  
  14. }
  15.  
  16. switch ((int)$num) {
  17. case 1:
  18. $word = 0;
  19. break;
  20. case 2:
  21. case 3:
  22. case 4:
  23. $word = 1;
  24. break;
  25. default:
  26. $word = 2;
  27. break;
  28. }
  29.  
  30. return vsprintf($this->words[$key.'.'.$word], $int); //authors.2, 12 : авторов, 12
  31.  
  32. }
AlkatraZ AlkatraZ (SV!) [Off] [#] (23.10.2016 / 23:13)
╭∩╮ (`-`) ╭∩╮
# ramzes (23.10.2016 / 20:47)
Альк, Чутка поофтоплю.
Глянь небольшой кодик, правильно ли я понял реализацию плюрализации?


// _plural(12, 'authors');

public function _plural($int, $key)
{

if($this->word
Не, там далеко не так просто, в PO файле есть что-то типа регулярки, которая задает правила множественных чисел, причем для каждого языка свое: https://github.com/Gazenwagen/ ... o#L28

Соответственно и реализация довольно сложная, с новой Симфонии ее (плюрализацию) к примеру вообще выпилили и предлагают вместо нее какое-то извращение. Во 2-й Симфонии плюралки были.
Вот пример моей старой реализации: https://github.com/Gazenwagen/ ... lural

Однако красивее всего плюрализация реализована у Зенда, они парсят непосредственно инструкцию из PO файла и обрабатывают ее, это лучший из вариантов.
---
Ну а реализация функции должна быть по правилам таковой (имя не важно):
translate($singular, $plural, $count)
Ты передаешь 3 аргумента: слово в единственном числе, слово во множественном числе и само число.
К примеру:
translate('apple', 'apples', 10)
на Русский переведет
(10) "яблок"
(1) "яблоко"
(3) "яблока"
Изм. AlkatraZ (23.10.2016 / 23:15) [1]
ramzes ramzes [Off] [#] (23.10.2016 / 23:17)
Ты передаешь 3 аргумента: слово в единственн6ом числе, слово во множественном числе и само число.зачем в единственном то?
у меня просто хранятся они в виде
author.0 = ""
author.1 = ""
author.2 = ""
0 это естественно ед. число.
по сути правила можно и подгружаемыми сделать, помню где то был файл со 100500 правилами, надо найти.
Но саму суть я верно понял?
AlkatraZ AlkatraZ (SV!) [Off] [#] (23.10.2016 / 23:26)
╭∩╮ (`-`) ╭∩╮
# ramzes (23.10.2016 / 23:17)
зачем в единственном то?
Дело в том, что функция, если не найдено перевода, должна вернуть тебе исходное слово, что ты ей передаешь в аргументе. Для Английского (исходный для Gettext) существует 2 плюральные формы, вот их ты и передаешь функции.
ramzes ramzes [Off] [#] (23.10.2016 / 23:37)
а... точно) забыл, две другие функции возвращают, а этой я чето не добисал)
intelligent intelligent [Off] [#] (01.01.2017 / 17:58)
Не понравилось, что Poedit нельзя натравить на всю папку с сайтом целиком, в которой он сам найдёт языковые файлы. Приходится каждый раз открывать файлы вручную. Удобства не хватает.
Вот если бы слева была древовидная колонка из папок и всех найденных файлов...
Изм. intelligent (01.01.2017 / 18:00) [2]
AlkatraZ AlkatraZ (SV!) [Off] [#] (02.01.2017 / 00:16)
╭∩╮ (`-`) ╭∩╮
# intelligent (01.01.2017 / 17:58)
Не понравилось, что Poedit нельзя натравить на всю папку с сайтом целиком, в которой он сам найдёт языковые файлы. Приходится каждый раз открывать файлы вручную. Удобства не хватает.
Вот если бы слев
С множеством файлов и их ручной обработкой действительно возникает некоторый геморой.
Но работу можно (и нужно) автоматизировать.

Теоретически, PoEdit хорош, когда ты работаешь со своим модулем и языковых файлов (доменов) у тебя мало. Тут этот редактор хорош, им же можно и извлекать из кода фразы и переводить и сразу же компилировать .MO файлы.

Но когда файлов и языков много (как в новом JohnCMS), уже возникает серьезная проблема, но к счастью она легко решается с помощью Grunt или командного .bat файла.
Для этого нам нужны официальные Gettext утилиты командной строки, которые (для Windows) можно качнуть отсюда: https://mlocati.github.io/arti ... .html
Рекомендую static версию, она не требует зависимостей.

После пишешь в бантике (или в задачах Grunt) нужные команды и вся рутина, на которую с PoEdit потратишь пару часов, решается за минуты.
  Всего: 34
1 2 >>

Фильтр по автору
Скачать тему

Форум

Новые вверху
Главная
0 / 34

JohnCMS 7.1.0

Яндекс.Метрика
© JohnCMS