Код, который большинство из нас пишет, как правило содержит ещё текст разные элементы интерфейса, описания, содержание имейлов и так далее. Но мы, программисты, не все получали пятёрки в школе за сочинение. Мы хорошо пишем код, но далеко не каждый из нас хорош в прозе.
В итоге мы видим тысячи сайтов и приложений, которые говорят с пользователями на неестественном языке вроде: Использованы запрещенные символы или Операция успешно завершена. Как часто вам в жизни, на улице говорят такие фразы?
А что если попробовать разделить код (логику) и текст? Крупные компании, наверняка, уже давно это делают, используя какие-то свои собственные решения, но для всех остальных - нет никакой готовой утилиты или фреймворка.
Реальность
Текущая реальность такова, что программист частично сам пишет тексты (допустим, названия кнопок), частично берет тексты из заданий. Это является частью репозитория - хранится вместе с кодом, а значит если кому-то в команде надо будет что-то поправить - надо делать коммит в репозиторий. Не совсем идеально - это же не логика, это просто кусок текста?
@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 реализацию, где команда хостит всё сама, и опциональный платный сервис, где можно заказывать переводы, проверку орфографии и так далее.