Код для 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();
}
}