Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Код, который большинство из нас пишет, как правило содержит ещё текст – разные элементы интерфейса, описания, содержание имейлов и так далее. Но мы, программисты, не все получали пятёрки в школе за сочинение. Мы хорошо пишем код, но далеко не каждый из нас хорош в прозе.
В итоге мы видим тысячи сайтов и приложений, которые говорят с пользователями на неестественном языке вроде: “Использованы запрещенные символы” или “Операция успешно завершена”. Как часто вам в жизни, на улице говорят такие фразы?
А что если попробовать разделить код (логику) и текст? Крупные компании, наверняка, уже давно это делают, используя какие-то свои собственные решения, но для всех остальных - нет никакой готовой утилиты или фреймворка.
Реальность
Текущая реальность такова, что программист частично сам пишет тексты (допустим, названия кнопок), частично берет тексты из заданий. Это является частью репозитория - хранится вместе с кодом, а значит если кому-то в команде надо будет что-то поправить - надо делать коммит в репозиторий. Не совсем идеально - это же не логика, это просто кусок текста?
@extends('layouts.main')
@section('contents')
<h2>Welcome home</h2>
<p>
We are thrilled to have you back, {{ $user->first_name }}
</p>
<a href="{{ route('download-bitcoin') }}" class="btn btn-primary">
Download my money
</a>
@endsection
Проблемы
Чтобы исправить текст - надо делать коммит в репозиторий с кодом. Для некоторых членов команды (компании), не программистов, это может быть непросто
Сложно отслеживать в каких местах и как на текущий момент наш продукт общается с пользователями - кусочки текста разбросаны по сотням файлов
Сложно соблюдать единый тон в сообщениях
Невозможно отследить появление новых текстов, когда программисты сами проявили инициативу
Альтернатива
А что если бы каждый новый кусок текста автоматически уходил в какой-то внешний сервис, и дальше содержание этого и других текстов уже контроллировалось напрямую из специального сервиса.
Программист добавил одну строку в шаблон home.blade.php (пример на PHP и фреймворке Laravel, но это подходит к любому языку и фреймворку)
Во время билда внешний сервис был извещен, что на такой-то строке в таком-то шаблоне новый кусок текста.
Нетехнические члены команды могут сами редактировать этот текст теперь, без помощи программистов. В код при этом никому лезть не надо.
Во время билда будут загружены все тексты из внешнего сервиса. Если для какого-то текста появился “уточненный” вариант - используется он, иначе по умолчанию - то что ввел программист.
Если проводить параллель с тем же Laravel, то это похоже на использование встроенной функции для переводов __(), но тексты хранятся не в локальных файлах внутри этого же репозитория, а в облаке, что создает целый ряд преимуществ.
Технические аспекты
Гипотетическая реализация могла бы выглядеть следующим образом (за пример опять возьмем фреймворк Laravel на PHP).
Обязываем программистов вместо прямой вставки текстов, использовать вспомогательную функцию - оборачивать все тексты. Можно даже добавить проверку автоматическую, что все тексты обернуты, иначе не давать пулл-реквесту пройти.
Реализуем консольную команду, которая отправляет все тексты завернутые в эту функцию по API куда-то во вне, в сервис управления текстами. Помимо текстов отправляются важные данные о контексте - в каком шаблоне текст, на каких строках, в каких маршрутах этот шаблон используется и так далее. Эта команда автоматически запускается в определенных моментах, например во время CI/CD билда.
Реализуем консольную команду, которая загружает новые версии текстов через API. Наша вспомогательная функция будет на лету заменять старый текст от программиста новой версией от других сотрудников компании - сотрудников, которые лучше пишут. Эта команда также может автоматически запускаться во время билда.
Создаем вэб-админку, где можно управлять всеми текстами нашего продукта. Видно что мы говорим и когда. В идеале - с рендерами. Теперь product manager, да и любой другой член команды, может отследить коммуникации от регистрации пользователя до любого действия.
Гипотетическая админка:
Шаблон, приведенный выше, превращается в что-то вроде:
@extends('layouts.main')
@section('contents')
<h2>@lang('Welcome home')</h2>
<p>
@lang("We are thrilled to have you back, {$user->first_name}")
</p>
<a href="{{ route('download-bitcoin') }}" class="btn btn-primary">
@lang('Download my money')
</a>
@endsection
Дополнительные плюсы
Помимо того, что теперь контроллировать наши коммуникации стало намного легче, появляются интересные дополнительные преимущества:
Возможность автоматической проверки орфографии - так как тексты аккуратно вынесены, очень просто применять open-source утилиты и находить в текстах ошибки.
Возможность перевода на другие языки - в этот процесс очень легко добавить работу над другими языками, переводы будут загружаться той же командой. Программисты не будут ничего трогать в основном репозитории.
Возможность реализовать альтернативные, параллельные тоны голоса на сайте в зависимости от типа пользователя (тинейджер, молодая мама, дедушка и тд) - можно динамически менять стиль коммуникаций в продукте.
Заключение
Хотелось бы услышать мнения других разработчиков - как позитивные, так и жесточайшую критику. В теории такой SaaS сервис мог бы иметь бесплатную open-source реализацию, где команда хостит всё сама, и опциональный платный сервис, где можно заказывать переводы, проверку орфографии и так далее.