Рынок IT-рекрутинга в России перенасыщен: hh.ru, Habr Career, LinkedIn. Но как найти разработчика из Беларуси, Казахстана или Армении? Как построить площадку, ориентированную на англоговорящую аудиторию, но с данными на двух языках? Один из наших клиентов — стартап из сферы HR-tech — решил создать международный джоб-борд для IT-специалистов, полностью на английском, но с возможностью перевода интерфейса и данных на русский.
Мы сделали площадку за 2 месяца на Falcon Space. Всего 350 тысяч рублей (лицензия + доработки). Сейчас на ней зарегистрировано 200+ работодателей и 3000+ соискателей. Расскажу, как настроить мультиязычный сайт с личными кабинетами и не сойти с ума.
Многие думают: «Переведу интерфейс на английский — и готово». Но на практике мультиязычный сайт с личными кабинетами включает три уровня:
В нашем проекте были требования:
Расскажу, как это реализовано в Falcon Space.
Платформа поддерживает несколько уровней локализации из коробки:
Схема для вакансий:
CREATE TABLE [app].[vacancies] (
vacancy_id int PRIMARY KEY,
company_id int,
created_at datetime,
is_active bit
);
CREATE TABLE [app].[vacancy_translations] (
translation_id int PRIMARY KEY,
vacancy_id int,
lang_code nvarchar(10), -- 'en', 'ru'
title nvarchar(200),
description nvarchar(MAX),
requirements nvarchar(MAX)
);
При отображении вакансии для текущего языка система сначала ищет перевод на язык пользователя. Если его нет — берёт язык по умолчанию (английский). Это позволяет работодателям заполнять вакансию хотя бы на одном языке, а со временем добавлять перевод.
На площадке две основные роли: Соискатель (Developer) и Работодатель (Employer). Есть также администратор.
При первом заходе пользователь видит английский интерфейс. Кнопка переключения меняет язык через параметр URL: ?lang=ru. После авторизации язык сохраняется в профиле пользователя в таблице users.lang. При следующем входе система автоматически подставляет сохранённый язык.
Для неавторизованных посетителей язык хранится в сессии или куке.
При поиске вакансий соискатель вводит ключевые слова на своём языке. Нужно искать и по англ, и по рус версиям заголовка, если они есть. Мы сделали полнотекстовый индекс на двух языках, используя CONTAINS.
CREATE FULLTEXT CATALOG ft_catalog AS DEFAULT;
CREATE FULLTEXT INDEX ON vacancy_translations(title, description)
KEY INDEX PK_vacancy_translations
WITH STOPLIST = SYSTEM;
Поиск: WHERE CONTAINS((title, description), @keywords).
Для SEO мы сделали поддомены: en.site.com — английская версия, ru.site.com — русская. В личном кабинете пользователя также есть выбор, но он может переключаться между поддоменами. Это стандартный подход для международных проектов.
Sitemap генерируется отдельно для каждого поддомена, включая все вакансии с соответствующими переводами. Это помогает поисковикам правильно индексировать версии.
Пример генерации URL для вакансии: en.site.com/vacancy/123 и ru.site.com/vacancy/123. При заходе на русскую версию заголовок и описание берутся из таблицы переводов с lang='ru'.
Шаблоны писем хранятся в таблице email_templates с полем lang_code. При отправке письма системе передаётся язык пользователя, и она выбирает нужный шаблон. Мы подготовили шаблоны на английском и русском для всех событий: регистрация, отклик на вакансию, приглашение на собеседование.
Проект был реализован за 2,5 месяца (с учётом тестирования). Бюджет — около 350 тыс. рублей (лицензия + доработки). Основные затраты ушли на адаптацию поиска и мультиязычную логику.
Через полгода после запуска:
Из отзыва заказчика (Startpack): «Разумный компромисс между универсальными решениями и разработкой с нуля. Готовность разработчиков развивать и добавлять функционал. Возможность в случае необходимости дальнейшей поддержки силами собственных разработчиков, владеющих только SQL и Bootstrap. Рекомендую».
Если вы планируете международный проект, закладывайте мультиязычность в ТЗ с самого начала. Переделывать потом — дороже в 3-4 раза.
Мультиязычный сайт расширяет вашу аудиторию в разы. Если вы хотите выйти на рынок СНГ или Европы — это must-have. На Falcon Space это реализуемо за разумные деньги.