OpenDTU/src/WebApi_i18n.cpp
2024-10-21 20:15:56 +02:00

79 lines
2.3 KiB
C++

// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2024 Thomas Basler and others
*/
#include "WebApi_i18n.h"
#include "I18n.h"
#include "Utils.h"
#include "WebApi.h"
#include <AsyncJson.h>
#include <LittleFS.h>
#include "MessageOutput.h"
void WebApiI18nClass::init(AsyncWebServer& server, Scheduler& scheduler)
{
using std::placeholders::_1;
server.on("/api/i18n/languages", HTTP_GET, std::bind(&WebApiI18nClass::onI18nLanguages, this, _1));
server.on("/api/i18n/language", HTTP_GET, std::bind(&WebApiI18nClass::onI18nLanguage, this, _1));
}
void WebApiI18nClass::onI18nLanguages(AsyncWebServerRequest* request)
{
AsyncJsonResponse* response = new AsyncJsonResponse(true);
auto& root = response->getRoot();
const auto& languages = I18n.getAvailableLanguages();
for (auto& language : languages) {
auto jsonLang = root.add<JsonObject>();
jsonLang["code"] = language.code;
jsonLang["name"] = language.name;
}
WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__);
}
void WebApiI18nClass::onI18nLanguage(AsyncWebServerRequest* request)
{
if (request->hasParam("code")) {
String code = request->getParam("code")->value();
String filename = I18n.getFilenameByLocale(code);
if (filename != "") {
String md5 = Utils::generateMd5FromFile(filename);
String expectedEtag;
expectedEtag = "\"";
expectedEtag += md5;
expectedEtag += "\"";
bool eTagMatch = false;
if (request->hasHeader("If-None-Match")) {
const AsyncWebHeader* h = request->getHeader("If-None-Match");
eTagMatch = h->value().equals(expectedEtag);
}
// begin response 200 or 304
AsyncWebServerResponse* response;
if (eTagMatch) {
response = request->beginResponse(304);
} else {
response = request->beginResponse(LittleFS, filename, asyncsrv::T_application_json);
}
// HTTP requires cache headers in 200 and 304 to be identical
response->addHeader("Cache-Control", "public, must-revalidate");
response->addHeader("ETag", expectedEtag);
request->send(response);
return;
}
}
request->send(404);
return;
}