JohnCMS | Переход на Gettext, мануал для разработчиков

2.81K
.
(\/)____o_O____(\/)
AlkatraZ, сколько нужно переводов по умолчанию, русский и английский?
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
# Koenig (22.09.2016 / 13:36)
AlkatraZ, сколько нужно переводов по умолчанию, русский и английский?
Если пишешь оф. модуль, как в твоем случае, тебе нужен только сам шаблон.
Далее, кидаешь его мне, я загружаю его на Crowdin и там уже переводим на все языки, что у нас есть.

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

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

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

Если условия соблюдаются, тогда, к примеру, создаете экаунт на Crowdin, отправляете им заявку (там предусмотрена форма) на openSource, где указываете ссылку на свой репозиторий. В течение суток Вам придет ответ и экаунт будет переведен на полный режим.
.
Альк, Чутка поофтоплю.
Глянь небольшой кодик, правильно ли я понял реализацию плюрализации?
// _plural(12, 'authors');

    public function _plural($int, $key)
    {

        if($this->words==false){
            $this->content();
        }

        $num = $int%100;
        if ($num>19) {
            $num = $num%10;

        }

        switch ((int)$num) {
            case 1:
                $word =  0;
                break;
            case 2:
            case 3:
            case 4:
                $word = 1;
                break;
            default:
                $word = 2;
                break;
        }

        return vsprintf($this->words[$key.'.'.$word], $int); //authors.2, 12 : авторов, 12

    }
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
# 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) "яблока"
.
Ты передаешь 3 аргумента: слово в единственн6ом числе, слово во множественном числе и само число.
зачем в единственном то?
у меня просто хранятся они в виде
author.0 = ""
author.1 = ""
author.2 = ""
0 это естественно ед. число.
по сути правила можно и подгружаемыми сделать, помню где то был файл со 100500 правилами, надо найти.
Но саму суть я верно понял?
.
╭∩╮ (`-`) ╭∩╮
# ramzes (23.10.2016 / 23:17)
зачем в единственном то?
Дело в том, что функция, если не найдено перевода, должна вернуть тебе исходное слово, что ты ей передаешь в аргументе. Для Английского (исходный для Gettext) существует 2 плюральные формы, вот их ты и передаешь функции.
.
а... точно) забыл, две другие функции возвращают, а этой я чето не добисал)
.
intelligent
Не понравилось, что Poedit нельзя натравить на всю папку с сайтом целиком, в которой он сам найдёт языковые файлы. Приходится каждый раз открывать файлы вручную. Удобства не хватает.
Вот если бы слева была древовидная колонка из папок и всех найденных файлов...
.
╭∩╮ (`-`) ╭∩╮
# intelligent (01.01.2017 / 17:58)
Не понравилось, что Poedit нельзя натравить на всю папку с сайтом целиком, в которой он сам найдёт языковые файлы. Приходится каждый раз открывать файлы вручную. Удобства не хватает.
Вот если бы слев
С множеством файлов и их ручной обработкой действительно возникает некоторый геморой.
Но работу можно (и нужно) автоматизировать.

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

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

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