Имея дело с переводами, вы сталкиваетесь с множеством каверзных вопросов, например, какие языки поддерживать, как вы переводите сообщения и как вы определяете язык. То, что казалось быстрой легкой задачей, становится бременем. Вот некоторые вещи, о которых следует помнить, прежде чем приступать к переводу приложения.
Языки
Если вы поддерживаете два или три языка, это не имеет большого значения. Но если вы хотите поддерживать дюжину вариантов, вы должны как-то решить, какие из них. Для начала неплохо погуглить самые популярные языки, но этот вариант совсем не точен. Лучше посмотрите статистику или аналитические отчеты, которые дадут вам представление о том, на каких языках говорят ваши пользователи. В Росплате я такие данные не собираю, поэтому нужна была другая точка отсчета. Мне пришлось проявить инициативу и просто спросить потенциальных пользователей: «Привет, ребята, какие языки вы ожидаете увидеть на странице настроек?». Честно говоря, ответ был неожиданным. Арабский, иврит, хинди и бенгалбский!
Обнаружение
Когда новый пользователь попадает в приложение, он может не говорить по-английски, который является языком по умолчанию. Значит, должен быть какой-то способ угадать. И есть один: используйте заголовок Accept-Language на стороне сервера. Этот заголовок не только говорит вам, какую локаль использовать, но и дает вам подсказку, например, этот пользователь говорит на языке А и языках Б (я уверен на 90%) и С (я уверен на 50%). С этой информацией вы можете быть намного увереннее: если вы не поддерживаете основной язык пользователя, вы, вероятно, можете использовать дополнительные.
Выбор
Когда пользователь входит в систему и меняет локаль, вы должны запомнить этот выбор. Например, я устанавливаю файл cookie только для http, указывающий предпочтения пользователя. В следующий раз, когда он запросит index.html с сервера, он получит его на основе этого значения файла cookie.
При этом у пользователя, скорее всего, несколько устройств. Если вы измените язык на смартфоне, вы ожидаете, что приложение будет переведено на этот язык, где бы вы его ни открывали. Это добавляет еще один слой. В итоге вот алгоритм решения:
Проверить куки.
Если в куки нет предпочтительного языка, проверьте, что есть в БД.
Если БД не знает, какой язык выбрал пользователь, проверьте заголовок Accept-Language.
В любом другом случае используйте локаль по умолчанию.
Сервисы против сообщества. Статические файлы против загрузки
Существует множество сервисов i18n, таких как https://weblate.org/ или Contentech. Их использование — хороший способ получить качественные переводы. И это, пожалуй, лучшее решение. Но в моем случае у меня нет возможности оплачивать такие услуги. И я решил обратиться за помощью к сообществу. Это казалось отличным способом вовлечь потенциальных пользователей в процесс создания приложения, которое они используют!
Еще одна вещь, о которой следует подумать, — готовы ли вы загружать свежие переводы с какого-либо сервиса каждый раз, когда кто-то запрашивает HTML-страницу, или «запекать» предварительно переведенные файлы и обслуживать их как статические? Для меня ответ был довольно очевиден:
Если вы можете сэкономить 10 мс времени обработки запроса, вы должны это сделать.
Заключение
Я надеюсь, что эта статья помогла вам спланировать свои следующие шаги на этом сложном (но важном) пути.
Кстати, призываю вас помочь моему проекту с открытым исходным кодом Росплата, добавив новую локаль или просмотрев существующие (потому что могут быть неточности).
И подписывайтесь на мой телеграм-канал, чтобы быть в курсе всех анонсов и интересных вещей!
Люблю вас всех!
ss-nopol
С таким подходом, как я могу вернуться назад, к режиму использования предпочтительного языка в настройках браузера?
Я бы хотел, чтобы после того как я изменю предпочтительный язык в настройках браузера, все приложения заговорили со мной на этом новом предпочтительном языке, я не на том что был тогда, когда я первый раз зашёл на сайт или том что я когда-то выбрал в настройках. То есть неплохо было бы оставить в настройках вариант типа "предпочтительный язык".
john_samilin Автор
Разумеется, всегда стоит добавлять такую опцию