SWEBB
@SWEBB
Software Developer

Как грамотно организовать поддержку языков для приложения Clients — Server (RESTFULL)?

Здравствуйте! Пришёл за советом архитекторов.
Есть задача по интернационализации приложения с архитектурой Сервер (RESTFULL API) -> Клиенты (WEB, Mobile, Desktop).

Приложение: Система бинарных опционов
Цель: интернационализировать приложение.
Источники данных: документно-ориентированное хранилище MongoDB. Данные храняться в BSON формате списком без вложенностей . В хранилище не предусмотрено динамических строк типа string, long, blob динамика только с типом decimal. Эти данные не нуждаются в локализации
Для чего нужна интернационализация: она нужна для комфортного использования приложения пользователями сервиса.
Функциональные требования: Только статические данные (не Input) доложны локализироваться на строне сервера приложения и(или) его клиентами (web,desktop,mobile). Также должна быть предусмотрена возможность шаблонирования строк. Клиент (браузер, моб. приложение) определяет регион пользователя.

Управление: должна быть возможность править языковые списки как программисту, так и администратору базы данных. На первоначальном уровне, достаточно будет управление через базу данных напрямую.

Вопрос: каким образом это сделать ? На клиентах или сервере ? Отдавать сервером уже готовые данные с нужным переводи или отдавать коды для перевода на клиентах ? Клиентов может быть много.

Это все должно легко поддерживаться и расширяться.

Стек технологий:
Клиенты: JS, JSON
Сервер: NodeJS, MongoDb, Redis
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Способов куча - от добавления заголовков с предпочитаемым языком до query параметров. Зависит от того с чем и как надо работать. Understand your data, как говорится
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Код для C#, но идея думаю понятная. Насчет заголовков думаю не стоит, посылать что то типа
X-Lang: en
это по моему изврат, придется настраивать эти заголовки еще и на реверс прокси.

Дальше по поводу форматированных строк. Храните все на сервере в виде плэйсхолдеров. На клиенте только форматируйте. Из плюсов, если изменится строка то все клиенты ее получат автоматом.

Например:

var localizableDict = { 
   pageTitle: "Page title",
  copyright:  " {{ copyDate }} ©" // выберите какой нибудь template engine для форматирования
}


Соответственно запросы идут вида:

GET /api/v1/documents/en/search/some+search
GET /api/v1/documents/ru/search/some+search

[Authorize]
        [HttpGet]
        [Route("{lang}/search/{query}")]
        [Route("{lang}/search")]
        public async Task<IActionResult> Search([FromRoute] string lang="en", string query = "")
        {
            try
            {
                var user = await _ctx.Users.GetUserByName(User.Identity.Name);
                var appUser = Mapper.Map<ApplicationUser>(user);               
                if(lang == "en"){
                       // todo: apply localization
                 }
                return Json(appUser);
            }
            catch (Exception e)
            {
                _logger.LogError($"Search error. {e.Message}");
                return BadRequest();
            }
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы