Как стать автором
Обновить

Комментарии 20

В тексте используются скриншоты некой внешней системы управления переводами, где-то есть готовые решения? Или подразумевается, что можно просто самому написать такой сервис?

Вангую что написано прямо в сервисе, а в p() завернуто обращение к хранилищу.
Вопрос только в том куда сохраняют — сразу в файлы генерят или в базу?
Да, в p() обращение к хранилищу. Хранилище — файловая система, и есть консольная команда, которая синхронизирует эти файлы с текстами с внешним API. Редакторы там что-то редактировали, а во время следующего билда скачались их новые тексты все
я накидал на локальной машине простенький прототип, чтобы проверить, что концепция реализуемая :) задумываюсь о том, чтобы создать такой сервис — пока не знаю по какой бизнес-модели.

Как планируется вычленять переменные из строк?


We are glad to have you back {$name}
через debug_backtrace() находим файл и номера строк, откуда произошел вызов функции, а затем делаем статический анализ (PhpParser) этих строк, чтобы отделить куски чистого текста от переменных и запомнить имена переменных (для читаемости). я проверил — работает
Часто возникает дилемма — использовать существующий текст или создать новый? А вдруг в этом новом месте чуть-чуть другой контекст?

А вот эта проблема как решается? К примеру у нас есть одна и та же фраза, но в разных файлах и, соответственно, разный контекст. Правильно я понимаю, в админке будет зарегистрированы две фразы и соответственно то, где они вызываются, и переводчикам самим предлагается определить контекст перевода?
А если вдруг мы код отрефакторили и теперь эти фразы вызываются из другого места?

Да — правильно, одна и та же фраза из двух мест будет показана дважды — будут указаны маршруты, имя шаблона или контроллера. Если это один шаблон (partial), то редактируется один раз, и в админке подписано, что это использовано на нескольких страницах. Если действительно просто повторяющийся текст — то заполняется как новый текст, но есть какой-то shortcut, чтобы переиспользовать существующий. Типа: «у Вас используется такое же выражение на страницах Х и Y, скопировать текст оттуда?»

Если код отрефакторили, то делаем попытку определить откуда по параметрам — изменился файл, откуда происходит вызов, но скорее всего исходный параметр остался тем же — вроде "Hello {$name}". Опять же, показываем диалог: «Это, наверное, перенесенный текст отсюда… Подтвердить?»

Получается, если разработчик решил порефакторить код, а работа с переводами уже закончена, т.е. никто в админку не зайдет и не увидит этих сообщений, то могут быть проблемы?

Самое худшее, что может случиться — это юзеры увидят «сырые» сообщения от разработчика. Даже это лучше, чем скажем увидеть «common.salutations.welcome» вместо сообщения (в случае метода #2) :) Можно придумать настройку — хочет ли компания по дефолту автоматический fallback если совпадает исходный параметр или нет. А если программист совсем сильно зарефакторил — то тут уже наверное сервис непричем, это в любом случае может быть проблемой, независимо от подхода

Сначала из кода программы выносят тексты для упрощения восприятия, потом отдают эти тексты на аутсорс в перевод, где сверхразумы переводят всё (включая имена ключей).


Это напоминает ситуацию с SQL, который был изобретён как упрощённое средство для простых пользователей по работе с данными, но в итоге из-за сложности вошёл в перечень программерских скиллов в нагрузку к всему остальному.

Ну, здесь нагрузки не должно быть никакой — просто обернуть параметры в функцию или директиву и все. На этом работа программиста закончена. А дальше уже коллеги могут смотреть и править. И никто не надоедает программистам с просьбами вроде: «измени текст Х на странице Y» :) Ну и вообще, коммиты в репозиторий, которые просто правят какую-нибудь опечатку — это достаточно скучно
А как предпросматривать текст, который отображается в ответ на конкретные действия пользователя?

Ну вот например — «сохранено». Усложненный вариант: контроллер с формой, отдельный контроллер обработки формы, добавление сессионного сообщения, редирект обратно на форму.
Над этим я еще думаю :) Технически весь необходимый арсенал уже есть — очень легко делается front-end тестирование со скриншотами (тот же puppeteer), надо только придумать как это будет организовано и как это будет управляться

i18s так же умеет числительные, как это будет у вас реализовано?

Предлагается пойти чуть дальше, чем это сделано в i18n. Имеем скажем текст от программиста: echo "Привет, у меня есть {$apples} яблок"; Наш сервис видит (благодаря статическому анализу), что внутри текста есть переменная $apples. В админке мы берем и выделяем мышкой слово «яблок» и нажимаем кнопку: «привязать к числу», где нам предлагается выбрать переменную. Она тут одна — $apples. Тогда подобно i18n, мы в админке предоставляем варианты написания в зависимости от цифры. Такой способ очень гибкий — не обязательно переводить весь текст, можно менять только фрагмент. Можно иметь несколько цифр внутри текста и тд. Ну и конечно, самый простой вариант — обязывать программиста передавать число вторым параметром в функцию p(), как это сделано сейчас в i18n. Но это не менее гибкий вариант и больше ручной работы
Хотел бы написать TLDR, но к сожалению я это прочитал. Это печаль.

Можно на пальцах рассказать чем предложенный велосипед лучше стандартного простого gettext?
Всем? :) 1) облачное управление, а не редактирование массы текстовых файлов 2) авто-детект, где используются тексты — контекст 3) предпросмотр/рендеры 4) авто-определение отсутствующих текстов, и многое другое. это так — первое, что в голову пришло. Ваш аргумент можно использовать и про Dropbox и Google Drive — зачем велосипед, когда есть стандартный простой FTP. Закачал свои файлы на FTP и все — тоже самое
1) облачное управление, а не редактирование массы текстовых файлов

Ок, раз пошли такие пляски и перевод стрелок с подменой понятий.
То чем ваше решение лучше тех же crowdin, alconost?

2) авто-детект, где используются тексты — контекст

Это в каком месте автодетект?
Там где пишете @p?
3) предпросмотр/рендеры

Вот прямо пререндер моего любого мобильного приложения или апи? Это где такое?

4) авто-определение отсутствующих текстов, и многое другое.

Это все есть давно.

Ваш аргумент можно использовать и про Dropbox и Google Drive — зачем велосипед, когда есть стандартный простой FTP

Я пока свои аргументы не излагал. Но задал всего лишь вопрос.

Как SaaS вам нужно сравниваться с другими подобными сервисами (чего в статье вы не делаете).
А как инструментарий on-premise ну как бы все уже давно есть в стандартных вещах.
2) да — вызов спец-функции или директивы отслеживает через stack tracing и статический анализ откуда был вызов, какие переменные подставлены и тд
3) пререндер через популярные современные утилиты вроде puppeteer. могу сразу увидеть, что тайская версия текста для кнопки — не влазит в ширину на телефоне

про облачные существующие сервисы — я не знал, я искал, хорошо искал, но не смог найти ни одного. поэтому благодарен за названия — я обязательно посмотрю. если там что-то подобное — то я просто буду пользоваться готовым :)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.