HTTPConnection::m_Tokens;
+
uint32_t HTTPConnection::CreateToken ()
{
uint32_t token;
@@ -1260,7 +1243,7 @@ namespace http {
s << "" << tr("ERROR") << ": " << tr("StreamID can't be null") << "
\r\n
\r\n";
s << "" << tr("Return to destination page") << "
\r\n";
- s << "" << tr("You will be redirected back in 5 seconds") << "";
+ s << "
" << tr("You will be redirected in 5 seconds") << "";
redirect = "5; url=" + webroot + "?page=local_destination&b32=" + b32;
res.add_header("Refresh", redirect.c_str());
return;
@@ -1273,7 +1256,7 @@ namespace http {
else {
s << "" << tr("ERROR") << ": " << tr("Transit tunnels count must not exceed 65535") << "\r\n
\r\n
\r\n";
s << "" << tr("Back to commands list") << "\r\n
\r\n";
- s << "
" << tr("You will be redirected back in 5 seconds") << "";
+ s << "
" << tr("You will be redirected in 5 seconds") << "";
res.add_header("Refresh", redirect.c_str());
return;
}
@@ -1281,7 +1264,7 @@ namespace http {
else if (cmd == HTTP_COMMAND_GET_REG_STRING)
{
std::string b32 = params["b32"];
- std::string name = params["name"];
+ std::string name = i2p::http::UrlDecode(params["name"]);
i2p::data::IdentHash ident;
ident.FromBase32 (b32);
@@ -1327,6 +1310,18 @@ namespace http {
s << "" << tr("Return to destination page") << "\r\n";
return;
}
+ else if (cmd == HTTP_COMMAND_SETLANGUAGE)
+ {
+ std::string lang = params["lang"];
+ std::string currLang = i2p::client::context.GetLanguage ()->GetLanguage();
+
+ if (currLang.compare(lang) != 0)
+ i2p::i18n::SetLanguage(lang);
+ }
+ else if (cmd == HTTP_COMMAND_RELOAD_CSS)
+ {
+ LoadExtCSS();
+ }
else
{
res.code = 400;
@@ -1389,6 +1384,8 @@ namespace http {
m_Thread.reset (new std::thread (std::bind (&HTTPServer::Run, this)));
m_Acceptor.listen ();
Accept ();
+
+ LoadExtCSS();
}
void HTTPServer::Stop ()
diff --git a/daemon/HTTPServerResources.h b/daemon/HTTPServerResources.h
new file mode 100644
index 00000000..876948e8
--- /dev/null
+++ b/daemon/HTTPServerResources.h
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2013-2021, The PurpleI2P Project
+*
+* This file is part of Purple i2pd project and licensed under BSD3
+*
+* See full license text in LICENSE file at top of project tree
+*/
+
+#ifndef HTTP_SERVER_RESOURCES_H__
+#define HTTP_SERVER_RESOURCES_H__
+
+namespace i2p
+{
+namespace http
+{
+ const std::string itoopieFavicon =
+ "data:image/png;base64,"
+ "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACx"
+ "jwv8YQUAAAAJcEhZcwAALiIAAC4iAari3ZIAAAAHdElNRQfgCQsUNSZrkhi1AAAAGXRFWHRTb2Z0"
+ "d2FyZQBwYWludC5uZXQgNC4wLjEyQwRr7AAAAoJJREFUOE9jwAUqi4Q1oEwwcDTV1+5sETaBclGB"
+ "vb09C5QJB6kWpvFQJoOCeLC5kmjEHCgXE2SlyETLi3h6QrkM4VL+ssWSCZUgtopITLKqaOotRTEn"
+ "cbAkLqAkGtOqLBLVAWLXyWSVFkkmRiqLxuaqiWb/VBYJMAYrwgckJY25VEUzniqKhjU2y+RtCRSP"
+ "6lUXy/1jIBV5tlYxZUaFVMq2NInwIi9hO8fSfOEAqDZUoCwal6MulvOvyS7gi69K4j9zxZT/m0ps"
+ "/28ptvvvquXXryIa7QYMMdTwqi0WNtVi0GIDseXl7TnUxFKfnGlxAGp0+D8j2eH/8Ub7/9e7nf7X"
+ "+Af/B7rwt6pI0h0l0WhQADOC9DBkhSirpImHNVZKp24ukkyoshGLnN8d5fA/y13t/44Kq/8hlnL/"
+ "z7fZ/58f6vcxSNpbVUVFhV1RLNBVTsQzVYZPSwhsCAhkiIfpNMrkbO6TLf071Sfk/5ZSi/+7q6z/"
+ "P5ns+v9mj/P/CpuI/20y+aeNGYxZoVoYGmsF3aFMBAAZlCwftnF9ke3//bU2//fXWP8/UGv731Am"
+ "+V+DdNblSqnUYqhSTKAiYSOqJBrVqiaa+S3UNPr/gmyH/xuKXf63hnn/B8bIP0UxHfEyyeSNQKVM"
+ "EB1AEB2twhcTLp+gIBJUoyKasEpVJHmqskh8qryovUG/ffCHHRU2q/Tk/YuB6eGPsbExa7ZkpLu1"
+ "oLEcVDtuUCgV1w60rQzElpRUE1EVSX0BYidHiInXF4nagNhYQW60EF+ApH1ktni0A1SIITSUgVlZ"
+ "JHYnlIsfzJjIp9xZKswL5YKBHL+coKJoRDaUSzoozxHVrygQU4JykQADAwAT5b1NHtwZugAAAABJ"
+ "RU5ErkJggg==";
+
+ // bundled style sheet
+ const std::string internalCSS =
+ "\r\n";
+
+ // for external style sheet
+ std::string externalCSS;
+
+} // http
+} // i2p
+
+#endif /* HTTP_SERVER_RESOURCES_H__ */
diff --git a/daemon/I2PControl.cpp b/daemon/I2PControl.cpp
index 12602c99..73dde618 100644
--- a/daemon/I2PControl.cpp
+++ b/daemon/I2PControl.cpp
@@ -406,7 +406,7 @@ namespace client
void I2PControlService::UptimeHandler (std::ostringstream& results)
{
- InsertParam (results, "i2p.router.uptime", (int)i2p::context.GetUptime ()*1000);
+ InsertParam (results, "i2p.router.uptime", std::to_string (i2p::context.GetUptime ()*1000LL));
}
void I2PControlService::VersionHandler (std::ostringstream& results)
diff --git a/debian/changelog b/debian/changelog
index 777b6216..c675f263 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+i2pd (2.39.0-1) unstable; urgency=medium
+
+ * updated to version 2.39.0/0.9.51
+
+ -- orignal Mon, 23 Aug 2021 16:00:00 +0000
+
i2pd (2.38.0-1) unstable; urgency=medium
* updated to version 2.38.0/0.9.50
diff --git a/debian/patches/02-upnp.patch b/debian/patches/02-upnp.patch
index 7b9bb317..75ea2bfa 100644
--- a/debian/patches/02-upnp.patch
+++ b/debian/patches/02-upnp.patch
@@ -6,12 +6,12 @@ Last-Update: 2021-01-16
--- i2pd.orig/Makefile
+++ i2pd/Makefile
-@@ -15,7 +15,7 @@ include filelist.mk
- USE_AESNI := yes
- USE_STATIC := no
- USE_MESHNET := no
--USE_UPNP := no
-+USE_UPNP := yes
- DEBUG := yes
+@@ -21,7 +21,7 @@ include filelist.mk
+ USE_AESNI := $(or $(USE_AESNI),yes)
+ USE_STATIC := $(or $(USE_STATIC),no)
+ USE_MESHNET := $(or $(USE_MESHNET),no)
+-USE_UPNP := $(or $(USE_UPNP),no)
++USE_UPNP := $(or $(USE_UPNP),yes)
+ DEBUG := $(or $(DEBUG),yes)
ifeq ($(DEBUG),yes)
diff --git a/filelist.mk b/filelist.mk
index e2a5d40e..d8f503e6 100644
--- a/filelist.mk
+++ b/filelist.mk
@@ -21,4 +21,6 @@ LIB_CLIENT_SRC = $(wildcard $(LIB_CLIENT_SRC_DIR)/*.cpp)
LANG_SRC = $(wildcard $(LANG_SRC_DIR)/*.cpp)
+WRAP_LIB_SRC = $(wildcard $(WRAP_SRC_DIR)/*.cpp)
+
DAEMON_SRC = $(wildcard $(DAEMON_SRC_DIR)/*.cpp)
diff --git a/i18n/Afrikaans.cpp b/i18n/Afrikaans.cpp
index 098c1105..5860facf 100644
--- a/i18n/Afrikaans.cpp
+++ b/i18n/Afrikaans.cpp
@@ -13,14 +13,16 @@
#include "I18N.h"
// Afrikaans localization file
-// This is an example translation file without strings in it.
namespace i2p
{
namespace i18n
{
-namespace afrikaans // language
+namespace afrikaans // language namespace
{
+ // language name in lowercase
+ static std::string language = "afrikaans";
+
// See for language plural forms here:
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
static int plural (int n) {
@@ -29,12 +31,9 @@ namespace afrikaans // language
static std::map strings
{
- {"Disabled", "Gedeaktiveer"},
- {"Enabled", "Geaktiveer"},
{"failed", "Het misluk"},
{"unknown", "onbekend"},
{"Tunnels", "Tonnels"},
- {"Transit tunnels", "Deurgang tonnels"},
{"I2P tunnels", "I2P tonnels"},
{"SAM sessions", "SAM sessies"},
{"OK", "LEKKER"},
@@ -52,6 +51,14 @@ namespace afrikaans // language
{"Hidden content. Press on text to see.", "Hidden content. Druk om te sien."},
{"Router Ident", "Router Ident"},
{"Router Family", "Router Familie"},
+ {"Enabled", "Geaktiveer"},
+ {"Disabled", "Gedeaktiveer"},
+ {"Change", "Verander"},
+ {"Change language", "Verander taal"},
+ {"Description", "Beskrywing"},
+ {"Submit", "Stuur"},
+ {"Proxy error", "Proxy-fout"},
+ {"Host", "Gasheer"},
{"", ""},
};
@@ -66,7 +73,7 @@ namespace afrikaans // language
std::shared_ptr GetLocale()
{
- return std::make_shared(strings, plurals, [] (int n)->int { return plural(n); });
+ return std::make_shared(language, strings, plurals, [] (int n)->int { return plural(n); });
}
} // language
diff --git a/i18n/English.cpp b/i18n/English.cpp
index 6015f8e1..2670e984 100644
--- a/i18n/English.cpp
+++ b/i18n/English.cpp
@@ -19,8 +19,11 @@ namespace i2p
{
namespace i18n
{
-namespace english // language
+namespace english // language namespace
{
+ // language name in lowercase
+ static std::string language = "english";
+
// See for language plural forms here:
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
static int plural (int n) {
@@ -39,7 +42,7 @@ namespace english // language
std::shared_ptr GetLocale()
{
- return std::make_shared(strings, plurals, [] (int n)->int { return plural(n); });
+ return std::make_shared(language, strings, plurals, [] (int n)->int { return plural(n); });
}
} // language
diff --git a/i18n/I18N.h b/i18n/I18N.h
index 272f65e8..5024fb56 100644
--- a/i18n/I18N.h
+++ b/i18n/I18N.h
@@ -9,7 +9,7 @@
#ifndef __I18N_H__
#define __I18N_H__
-#include "RouterContext.h"
+#include "ClientContext.h"
namespace i2p
{
@@ -17,26 +17,21 @@ namespace i18n
{
inline void SetLanguage(const std::string &lang)
{
- if (!lang.compare("afrikaans"))
- i2p::context.SetLanguage (i2p::i18n::afrikaans::GetLocale());
- else if (!lang.compare("russian"))
- i2p::context.SetLanguage (i2p::i18n::russian::GetLocale());
- else if (!lang.compare("turkmen"))
- i2p::context.SetLanguage (i2p::i18n::turkmen::GetLocale());
- else if (!lang.compare("ukrainian"))
- i2p::context.SetLanguage (i2p::i18n::ukrainian::GetLocale());
- else // fallback
- i2p::context.SetLanguage (i2p::i18n::english::GetLocale());
+ const auto it = i2p::i18n::languages.find(lang);
+ if (it == i2p::i18n::languages.end()) // fallback
+ i2p::client::context.SetLanguage (i2p::i18n::english::GetLocale());
+ else
+ i2p::client::context.SetLanguage (it->second.LocaleFunc());
}
inline std::string translate (const std::string& arg)
{
- return i2p::context.GetLanguage ()->GetString (arg);
+ return i2p::client::context.GetLanguage ()->GetString (arg);
}
inline std::string translate (const std::string& arg, const std::string& arg2, const int& n)
{
- return i2p::context.GetLanguage ()->GetPlural (arg, arg2, n);
+ return i2p::client::context.GetLanguage ()->GetPlural (arg, arg2, n);
}
} // i18n
} // i2p
diff --git a/i18n/I18N_langs.h b/i18n/I18N_langs.h
index 181a4793..559b17be 100644
--- a/i18n/I18N_langs.h
+++ b/i18n/I18N_langs.h
@@ -17,10 +17,17 @@ namespace i18n
{
public:
Locale (
+ const std::string& language,
const std::map& strings,
const std::map>& plurals,
std::function formula
- ): m_Strings (strings), m_Plurals (plurals), m_Formula (formula) { };
+ ): m_Language (language), m_Strings (strings), m_Plurals (plurals), m_Formula (formula) { };
+
+ // Get activated language name for webconsole
+ std::string GetLanguage() const
+ {
+ return m_Language;
+ }
std::string GetString (const std::string& arg) const
{
@@ -50,17 +57,39 @@ namespace i18n
}
private:
+ const std::string m_Language;
const std::map m_Strings;
const std::map> m_Plurals;
std::function m_Formula;
};
+ struct langData
+ {
+ std::string LocaleName; // localized name
+ std::string ShortCode; // short language code, like "en"
+ std::function (void)> LocaleFunc;
+ };
+
// Add localization here with language name as namespace
namespace afrikaans { std::shared_ptr GetLocale (); }
namespace english { std::shared_ptr GetLocale (); }
namespace russian { std::shared_ptr GetLocale (); }
namespace turkmen { std::shared_ptr GetLocale (); }
namespace ukrainian { std::shared_ptr GetLocale (); }
+ namespace uzbek { std::shared_ptr GetLocale (); }
+
+ /**
+ * That map contains international language name lower-case and name in it's language
+ */
+ static std::map languages
+ {
+ { "afrikaans", {"Afrikaans", "af", i2p::i18n::afrikaans::GetLocale} },
+ { "english", {"English", "en", i2p::i18n::english::GetLocale} },
+ { "russian", {"русский язык", "ru", i2p::i18n::russian::GetLocale} },
+ { "turkmen", {"türkmen dili", "tk", i2p::i18n::turkmen::GetLocale} },
+ { "ukrainian", {"украї́нська мо́ва", "uk", i2p::i18n::ukrainian::GetLocale} },
+ { "uzbek", {"Oʻzbek", "uz", i2p::i18n::uzbek::GetLocale} },
+ };
} // i18n
} // i2p
diff --git a/i18n/Russian.cpp b/i18n/Russian.cpp
index 7df82d54..f6a19c7c 100644
--- a/i18n/Russian.cpp
+++ b/i18n/Russian.cpp
@@ -18,8 +18,11 @@ namespace i2p
{
namespace i18n
{
-namespace russian // language
+namespace russian // language namespace
{
+ // language name in lowercase
+ static std::string language = "russian";
+
// See for language plural forms here:
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
static int plural (int n) {
@@ -28,23 +31,148 @@ namespace russian // language
static std::map strings
{
- // HTTP Proxy
+ {"KiB", "КиБ"},
+ {"MiB", "МиБ"},
+ {"GiB", "ГиБ"},
+ {"building", "строится"},
+ {"failed", "неудачный"},
+ {"expiring", "истекает"},
+ {"established", "работает"},
+ {"unknown", "неизвестно"},
+ {"exploratory", "исследовательский"},
+ {"i2pd webconsole", "Веб-консоль i2pd"},
+ {"Main page", "Главная"},
+ {"Router commands", "Команды роутера"},
+ {"Local Destinations", "Локальные назначения"},
+ {"LeaseSets", "Лизсеты"},
+ {"Tunnels", "Туннели"},
+ {"Transit Tunnels", "Транзитные туннели"},
+ {"Transports", "Транспорты"},
+ {"I2P tunnels", "I2P туннели"},
+ {"SAM sessions", "SAM сессии"},
+ {"ERROR", "ОШИБКА"},
+ {"OK", "OK"},
+ {"Testing", "Тестирование"},
+ {"Firewalled", "Заблокировано извне"},
+ {"Unknown", "Неизвестно"},
+ {"Proxy", "Прокси"},
+ {"Mesh", "MESH-сеть"},
+ {"Error", "Ошибка"},
+ {"Clock skew", "Не точное время"},
+ {"Offline", "Оффлайн"},
+ {"Symmetric NAT", "Симметричный NAT"},
+ {"Uptime", "В сети"},
+ {"Network status", "Сетевой статус"},
+ {"Network status v6", "Сетевой статус v6"},
+ {"Stopping in", "Остановка через"},
+ {"Family", "Семейство"},
+ {"Tunnel creation success rate", "Успешно построенных туннелей"},
+ {"Received", "Получено"},
+ {"KiB/s", "КиБ/с"},
+ {"Sent", "Отправлено"},
+ {"Transit", "Транзит"},
+ {"Data path", "Путь к данным"},
+ {"Hidden content. Press on text to see.", "Скрытый контент. Нажмите на текст чтобы отобразить."},
+ {"Router Ident", "Идентификатор роутера"},
+ {"Router Family", "Семейство роутера"},
+ {"Router Caps", "Флаги роутера"},
+ {"Version", "Версия"},
+ {"Our external address", "Наш внешний адрес"},
+ {"supported", "поддерживается"},
+ {"Routers", "Роутеры"},
+ {"Floodfills", "Флудфилы"},
+ {"Client Tunnels", "Клиентские туннели"},
+ {"Services", "Сервисы"},
+ {"Enabled", "Включено"},
+ {"Disabled", "Выключено"},
+ {"Encrypted B33 address", "Шифрованные B33 адреса"},
+ {"Address registration line", "Строка регистрации адреса"},
+ {"Domain", "Домен"},
+ {"Generate", "Сгенерировать"},
+ {"Note: result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "Примечание: полученная строка может быть использована только для регистрации доменов второго уровня (example.i2p). Для регистрации поддоменов используйте i2pd-tools."},
+ {"Address", "Адрес"},
+ {"Type", "Тип"},
+ {"EncType", "ТипШифр"},
+ {"Inbound tunnels", "Входящие туннели"},
+ {"ms", "мс"},
+ {"Outbound tunnels", "Исходящие туннели"},
+ {"Tags", "Теги"},
+ {"Incoming", "Входящие"},
+ {"Outgoing", "Исходящие"},
+ {"Destination", "Назначение"},
+ {"Amount", "Количество"},
+ {"Incoming Tags", "Входящие теги"},
+ {"Tags sessions", "Сессии тегов"},
+ {"Status", "Статус"},
+ {"Local Destination", "Локальное назначение"},
+ {"Streams", "Стримы"},
+ {"Close stream", "Закрыть стрим"},
+ {"I2CP session not found", "I2CP сессия не найдена"},
+ {"I2CP is not enabled", "I2CP не включен"},
+ {"Invalid", "Некорректный"},
+ {"Store type", "Тип хранилища"},
+ {"Expires", "Истекает"},
+ {"Non Expired Leases", "Не истекшие Lease-ы"},
+ {"Gateway", "Шлюз"},
+ {"TunnelID", "ID туннеля"},
+ {"EndDate", "Заканчивается"},
+ {"not floodfill", "не флудфил"},
+ {"Queue size", "Размер очереди"},
+ {"Run peer test", "Запустить тестирование"},
+ {"Decline transit tunnels", "Отклонять транзитные туннели"},
+ {"Accept transit tunnels", "Принимать транзитные туннели"},
+ {"Cancel graceful shutdown", "Отменить плавную остановку"},
+ {"Start graceful shutdown", "Запустить плавную остановку"},
+ {"Force shutdown", "Принудительная остановка"},
+ {"Reload external CSS styles", "Перезагрузить внешние CSS стили"},
+ {"Note: any action done here are not persistent and not changes your config files.", "Примечание: любое действие произведенное здесь не является постоянным и не изменяет ваши конфигурационные файлы."},
+ {"Logging level", "Уровень логирования"},
+ {"Transit tunnels limit", "Лимит транзитных туннелей"},
+ {"Change", "Изменить"},
+ {"Change language", "Изменение языка"},
+ {"no transit tunnels currently built", "нет построенных транзитных туннелей"},
+ {"SAM disabled", "SAM выключен"},
+ {"no sessions currently running", "нет запущенных сессий"},
+ {"SAM session not found", "SAM сессия не найдена"},
+ {"SAM Session", "SAM сессия"},
+ {"Server Tunnels", "Серверные туннели"},
+ {"Client Forwards", "Клиентские перенаправления"},
+ {"Server Forwards", "Серверные перенаправления"},
+ {"Unknown page", "Неизвестная страница"},
+ {"Invalid token", "Неверный токен"},
+ {"SUCCESS", "УСПЕШНО"},
+ {"Stream closed", "Стрим закрыт"},
+ {"Stream not found or already was closed", "Стрим не найден или уже закрыт"},
+ {"Destination not found", "Точка назначения не найдена"},
+ {"StreamID can't be null", "StreamID не может быть пустым"},
+ {"Return to destination page", "Вернуться на страницу точки назначения"},
+ {"You will be redirected in 5 seconds", "Вы будете переадресованы через 5 секунд"},
+ {"Transit tunnels count must not exceed 65535", "Число транзитных туннелей не должно превышать 65535"},
+ {"Back to commands list", "Вернуться к списку команд"},
+ {"Register at reg.i2p", "Зарегистрировать на reg.i2p"},
+ {"Description", "Описание"},
+ {"A bit information about service on domain", "Немного информации о сервисе на домене"},
+ {"Submit", "Отправить"},
+ {"Domain can't end with .b32.i2p", "Домен не может заканчиваться на .b32.i2p"},
+ {"Domain must end with .i2p", "Домен должен заканчиваться на .i2p"},
+ {"Such destination is not found", "Такая точка назначения не найдена"},
+ {"Unknown command", "Неизвестная команда"},
+ {"Command accepted", "Команда принята"},
{"Proxy error", "Ошибка прокси"},
{"Proxy info", "Информация прокси"},
- {"Proxy error: Host not found", "Ошибка прокси: Адрес не найден"},
- {"Remote host not found in router's addressbook", "Запрошенный адрес не найден в адресной книге роутера"},
- {"You may try to find this host on jump services below", "Вы можете попробовать найти адрес на джамп сервисах ниже"},
+ {"Proxy error: Host not found", "Ошибка прокси: Узел не найден"},
+ {"Remote host not found in router's addressbook", "Запрошенный узел не найден в адресной книге роутера"},
+ {"You may try to find this host on jump services below", "Вы можете попробовать найти узел через джамп сервисы ниже"},
{"Invalid request", "Некорректный запрос"},
{"Proxy unable to parse your request", "Прокси не может разобрать ваш запрос"},
{"addresshelper is not supported", "addresshelper не поддерживается"},
- {"Host", "Адрес"},
+ {"Host", "Узел"},
{"added to router's addressbook from helper", "добавлен в адресную книгу роутера через хелпер"},
- {"already in router's addressbook", "уже в адресной книге роутера"},
- {"Click", "Нажмите"},
- {"here", "здесь"},
- {"to proceed", "чтобы продолжить"},
- {"to update record", "чтобы обновить запись"},
+ {"Click here to proceed:", "Нажмите здесь, чтобы продолжить:"},
+ {"Continue", "Продолжить"},
{"Addresshelper found", "Найден addresshelper"},
+ {"already in router's addressbook", "уже в адресной книге роутера"},
+ {"Click here to update record:", "Нажмите здесь, чтобы обновить запись:"},
{"invalid request uri", "некорректный URI запроса"},
{"Can't detect destination host from request", "Не удалось определить адрес назначения из запроса"},
{"Outproxy failure", "Ошибка внешнего прокси"},
@@ -63,169 +191,13 @@ namespace russian // language
{"cannot connect", "не удалось подключиться"},
{"http out proxy not implemented", "поддержка внешнего HTTP прокси сервера не реализована"},
{"cannot connect to upstream http proxy", "не удалось подключиться к вышестоящему HTTP прокси серверу"},
- {"Host is down", "Адрес недоступен"},
- {"Can't create connection to requested host, it may be down. Please try again later.",
- "Не удалось установить соединение к запрошенному адресу, возможно он не в сети. Попробуйте повторить запрос позже."},
-
- // Webconsole //
- // cssStyles
- {"Disabled", "Выключено"},
- {"Enabled", "Включено"},
- // ShowTraffic
- {"KiB", "КиБ"},
- {"MiB", "МиБ"},
- {"GiB", "ГиБ"},
- // ShowTunnelDetails
- {"building", "строится"},
- {"failed", "неудачный"},
- {"expiring", "истекает"},
- {"established", "работает"},
- {"exploratory", "исследовательский"},
- {"unknown", "неизвестно"},
- {"i2pd webconsole", "Веб-консоль i2pd"},
- // ShowPageHead
- {"Main page", "Главная"},
- {"Router commands", "Команды роутера"},
- {"Local destinations", "Локальные назнач."},
- {"LeaseSets", "Лизсеты"},
- {"Tunnels", "Туннели"},
- {"Transit tunnels", "Транзит. туннели"},
- {"Transports", "Транспорты"},
- {"I2P tunnels", "I2P туннели"},
- {"SAM sessions", "SAM сессии"},
- // Network Status
- {"OK", "OK"},
- {"Testing", "Тестирование"},
- {"Firewalled", "Заблокировано извне"},
- {"Unknown", "Неизвестно"},
- {"Proxy", "Прокси"},
- {"Mesh", "MESH-сеть"},
- {"Error", "Ошибка"},
- {"Clock skew", "Не точное время"},
- {"Offline", "Оффлайн"},
- {"Symmetric NAT", "Симметричный NAT"},
- // Status
- {"Uptime", "В сети"},
- {"Network status", "Сетевой статус"},
- {"Network status v6", "Сетевой статус v6"},
- {"Stopping in", "Остановка через"},
- {"Family", "Семейство"},
- {"Tunnel creation success rate", "Успешно построенных туннелей"},
- {"Received", "Получено"},
- {"Sent", "Отправлено"},
- {"Transit", "Транзит"},
- {"KiB/s", "КиБ/с"},
- {"Data path", "Путь к данным"},
- {"Hidden content. Press on text to see.", "Скрытый контент. Нажмите на текст чтобы отобразить."},
- {"Router Ident", "Идентификатор роутера"},
- {"Router Family", "Семейство роутера"},
- {"Router Caps", "Флаги роутера"},
- {"Version", "Версия"},
- {"Our external address", "Наш внешний адрес"},
- {"supported", "поддерживается"},
- {"Routers", "Роутеры"},
- {"Floodfills", "Флудфилы"},
- {"LeaseSets", "Лизсеты"},
- {"Client Tunnels", "Клиентские туннели"},
- {"Transit Tunnels", "Транзитные туннели"},
- {"Services", "Сервисы"},
- // ShowLocalDestinations
- {"Local Destinations", "Локальные назначения"},
- // ShowLeaseSetDestination
- {"Encrypted B33 address", "Шифрованные B33 адреса"},
- {"Address registration line", "Строка регистрации адреса"},
- {"Domain", "Домен"},
- {"Generate", "Сгенерировать"},
- {"Note: result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.",
- "Примечание: полученная строка может быть использована только для регистрации доменов второго уровня. Для регистрации поддоменов используйте i2pd-tools."},
- {"Address", "Адрес"},
- {"Type", "Тип"},
- {"EncType", "ТипШифр"},
- {"Inbound tunnels", "Входящие туннели"},
- {"Outbound tunnels", "Исходящие туннели"},
- {"ms", "мс"}, // milliseconds
- {"Tags", "Теги"},
- {"Incoming", "Входящие"},
- {"Outgoing", "Исходящие"},
- {"Destination", "Назначение"},
- {"Amount", "Количество"},
- {"Incoming Tags", "Входящие Теги"},
- {"Tags sessions", "Сессии Тегов"},
- {"Status", "Статус"},
- // ShowLocalDestination
- {"Local Destination", "Локальное назначение"},
- {"Streams", "Стримы"},
- {"Close stream", "Закрыть стрим"},
- // ShowI2CPLocalDestination
- {"I2CP session not found", "I2CP сессия не найдена"},
- {"I2CP is not enabled", "I2CP не включен"},
- // ShowLeasesSets
- {"Invalid", "Некорректный"},
- {"Store type", "Тип хранилища"},
- {"Expires", "Истекает"},
- {"Non Expired Leases", "Не истекшие Lease-ы"},
- {"Gateway", "Шлюз"},
- {"TunnelID", "ID туннеля"},
- {"EndDate", "Заканчивается"},
- {"not floodfill", "не флудфил"},
- // ShowTunnels
- {"Queue size", "Размер очереди"},
- // ShowCommands
- {"Run peer test", "Запустить тестирование"},
- {"Decline transit tunnels", "Отклонять транзитные туннели"},
- {"Accept transit tunnels", "Принимать транзитные туннели"},
- {"Cancel graceful shutdown", "Отменить плавную остановку"},
- {"Start graceful shutdown", "Запустить плавную остановку"},
- {"Force shutdown", "Принудительная остановка"},
- {"Note: any action done here are not persistent and not changes your config files.",
- "Примечание: любое действие произведенное здесь не является постоянным и не изменяет ваши конфигурационные файлы."},
- {"Logging level", "Уровень логирования"},
- {"Transit tunnels limit", "Лимит транзитных туннелей"},
- {"Change", "Изменить"},
- // ShowTransitTunnels
- {"no transit tunnels currently built", "нет построенных транзитных туннелей"},
- // ShowSAMSessions/ShowSAMSession
- {"SAM disabled", "SAM выключен"},
- {"SAM session not found", "SAM сессия не найдена"},
- {"no sessions currently running", "нет запущенных сессий"},
- {"SAM Session", "SAM сессия"},
- // ShowI2PTunnels
- {"Server Tunnels", "Серверные туннели"},
- {"Client Forwards", "Клиентские перенаправления"},
- {"Server Forwards", "Серверные перенаправления"},
- // HandlePage
- {"Unknown page", "Неизвестная страница"},
- // HandleCommand, ShowError
- {"Invalid token", "Неверный токен"},
- {"SUCCESS", "УСПЕШНО"},
- {"ERROR", "ОШИБКА"},
- {"Unknown command", "Неизвестная команда"},
- {"Command accepted", "Команда принята"},
- {"Back to commands list", "Вернуться к списку команд"},
- {"You will be redirected in 5 seconds", "Вы будете переадресованы через 5 секунд"},
- // HTTP_COMMAND_KILLSTREAM
- {"Stream closed", "Стрим закрыт"},
- {"Stream not found or already was closed", "Стрим не найден или уже закрыт"},
- {"Destination not found", "Точка назначения не найдена"},
- {"StreamID can't be null", "StreamID не может быть пустым"},
- {"Return to destination page", "Вернуться на страницу точки назначения"},
- {"You will be redirected back in 5 seconds", "Вы будете переадресованы назад через 5 секунд"},
- // HTTP_COMMAND_LIMITTRANSIT
- {"Transit tunnels count must not exceed 65535", "Число транзитных туннелей не должно превышать 65535"},
- // HTTP_COMMAND_GET_REG_STRING
- {"Register at reg.i2p", "Зарегистрировать на reg.i2p"},
- {"Description", "Описание"},
- {"A bit information about service on domain", "Немного информации о сервисе на домене"},
- {"Submit", "Отправить"},
- {"Domain can't end with .b32.i2p", "Домен не может заканчиваться на .b32.i2p"},
- {"Domain must end with .i2p", "Домен должен заканчиваться на .i2p"},
- {"Such destination is not found", "Такая точка назначения не найдена"},
+ {"Host is down", "Узел недоступен"},
+ {"Can't create connection to requested host, it may be down. Please try again later.", "Не удалось установить соединение к запрошенному узлу, возможно он не в сети. Попробуйте повторить запрос позже."},
{"", ""},
};
static std::map> plurals
{
- // ShowUptime
{"days", {"день", "дня", "дней"}},
{"hours", {"час", "часа", "часов"}},
{"minutes", {"минуту", "минуты", "минут"}},
@@ -235,7 +207,7 @@ namespace russian // language
std::shared_ptr GetLocale()
{
- return std::make_shared(strings, plurals, [] (int n)->int { return plural(n); });
+ return std::make_shared(language, strings, plurals, [] (int n)->int { return plural(n); });
}
} // language
diff --git a/i18n/Turkmen.cpp b/i18n/Turkmen.cpp
index 0edc9a6e..1d4f5ee1 100644
--- a/i18n/Turkmen.cpp
+++ b/i18n/Turkmen.cpp
@@ -18,8 +18,11 @@ namespace i2p
{
namespace i18n
{
-namespace turkmen // language
+namespace turkmen // language namespace
{
+ // language name in lowercase
+ static std::string language = "turkmen";
+
// See for language plural forms here:
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
static int plural (int n) {
@@ -28,7 +31,133 @@ namespace turkmen // language
static std::map strings
{
- // HTTP Proxy
+ {"KiB", "KiB"},
+ {"MiB", "MiB"},
+ {"GiB", "GiB"},
+ {"building", "bina"},
+ {"failed", "şowsuz"},
+ {"expiring", "möhleti gutarýar"},
+ {"established", "işleýär"},
+ {"unknown", "näbelli"},
+ {"exploratory", "gözleg"},
+ {"i2pd webconsole", "Web konsoly i2pd"},
+ {"Main page", "Esasy sahypa"},
+ {"Router commands", "Marşrutizator buýruklary"},
+ {"Local Destinations", "Ýerli ýerler"},
+ {"LeaseSets", "Lizset"},
+ {"Tunnels", "Tuneller"},
+ {"Transit Tunnels", "Tranzit Tunelleri"},
+ {"Transports", "Daşamak"},
+ {"I2P tunnels", "I2P tuneller"},
+ {"SAM sessions", "SAM Sessiýasy"},
+ {"ERROR", "Ýalňyşlyk"},
+ {"OK", "OK"},
+ {"Testing", "Synag etmek"},
+ {"Firewalled", "Daşynda petiklendi"},
+ {"Unknown", "Näbelli"},
+ {"Proxy", "Proksi"},
+ {"Mesh", "MESH-tor"},
+ {"Error", "Ýalňyşlyk"},
+ {"Clock skew", "Takyk wagt däl"},
+ {"Offline", "Awtonom"},
+ {"Symmetric NAT", "Simmetriklik NAT"},
+ {"Uptime", "Onlaýn onlaýn sözlügi"},
+ {"Network status", "Tor ýagdaýy"},
+ {"Network status v6", "Tor ýagdaýy v6"},
+ {"Stopping in", "Soň duruň"},
+ {"Family", "Maşgala"},
+ {"Tunnel creation success rate", "Gurlan teneller üstünlikli gurlan teneller"},
+ {"Received", "Alnan"},
+ {"KiB/s", "KiB/s"},
+ {"Sent", "Ýerleşdirildi"},
+ {"Transit", "Tranzit"},
+ {"Data path", "Maglumat ýoly"},
+ {"Hidden content. Press on text to see.", "Gizlin mazmun. Görkezmek üçin tekste basyň."},
+ {"Router Ident", "Marşrutly kesgitleýji"},
+ {"Router Family", "Marşrutler maşgalasy"},
+ {"Router Caps", "Baýdaklar marşruteri"},
+ {"Version", "Wersiýasy"},
+ {"Our external address", "Daşarky salgymyz"},
+ {"supported", "goldanýar"},
+ {"Routers", "Marşrutizatorlar"},
+ {"Floodfills", "Fludfillar"},
+ {"Client Tunnels", "Müşderi tunelleri"},
+ {"Services", "Hyzmatlar"},
+ {"Enabled", "Goşuldy"},
+ {"Disabled", "Öçürildi"},
+ {"Encrypted B33 address", "Şifrlenen B33 salgylar"},
+ {"Address registration line", "Hasaba alyş salgysy"},
+ {"Domain", "Domen"},
+ {"Generate", "Öndürmek"},
+ {"Note: result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "Bellik: Alnan setir diňe ikinji derejeli domenleri bellige almak üçin ulanylyp bilner (example.i2p). Subýutmalary hasaba almak üçin i2pd ulanyň-tools."},
+ {"Address", "Salgysy"},
+ {"Type", "Görnüş"},
+ {"EncType", "Şifrlemek görnüşi"},
+ {"Inbound tunnels", "Gelýän tuneller"},
+ {"ms", "ms"},
+ {"Outbound tunnels", "Çykýan tuneller"},
+ {"Tags", "Bellikler"},
+ {"Incoming", "Gelýän"},
+ {"Outgoing", "Çykýan"},
+ {"Destination", "Maksat"},
+ {"Amount", "Sany"},
+ {"Incoming Tags", "Gelýän bellikler"},
+ {"Tags sessions", "Sapaklar bellikler"},
+ {"Status", "Ýagdaýy"},
+ {"Local Destination", "Ýerli maksat"},
+ {"Streams", "Strimlary"},
+ {"Close stream", "Yap strim"},
+ {"I2CP session not found", "I2CP Sessiýa tapylmady"},
+ {"I2CP is not enabled", "I2CP goşulmaýar"},
+ {"Invalid", "Nädogry"},
+ {"Store type", "Ammar görnüşi"},
+ {"Expires", "Möhleti gutarýar"},
+ {"Non Expired Leases", "Möhleti gutarmady Lizsetlary"},
+ {"Gateway", "Derweze"},
+ {"TunnelID", "Tuneliň ID"},
+ {"EndDate", "Gutarýar"},
+ {"not floodfill", "fludfil däl"},
+ {"Queue size", "Nobatyň ululygy"},
+ {"Run peer test", "Synag başlaň"},
+ {"Decline transit tunnels", "Tranzit tunellerini ret ediň"},
+ {"Accept transit tunnels", "Tranzit tunellerini alyň"},
+ {"Cancel graceful shutdown", "Tekiz durmagy ýatyryň"},
+ {"Start graceful shutdown", "Tekiz durmak"},
+ {"Force shutdown", "Mejbury duralga"},
+ {"Reload external CSS styles", "Daşarky CSS stillerini täzeden ýükläň"},
+ {"Note: any action done here are not persistent and not changes your config files.", "Bellik: Bu ýerde öndürilen islendik çäre hemişelik däl we konfigurasiýa faýllaryňyzy üýtgetmeýär."},
+ {"Logging level", "Giriş derejesi"},
+ {"Transit tunnels limit", "Tranzit tunelleriniň çägi"},
+ {"Change", "Üýtgetmek"},
+ {"Change language", "Dil üýtgetmek"},
+ {"no transit tunnels currently built", "gurlan tranzit tunelleri ýok"},
+ {"SAM disabled", "SAM öçürilen"},
+ {"no sessions currently running", "başlamagyň sessiýalary ýok"},
+ {"SAM session not found", "SAM Sessiýa tapylmady"},
+ {"SAM Session", "SAM Sessiýa"},
+ {"Server Tunnels", "Serwer tunelleri"},
+ {"Client Forwards", "Müşderi gönükdirýär"},
+ {"Server Forwards", "Serweriň täzeden düzlüleri"},
+ {"Unknown page", "Näbelli sahypa"},
+ {"Invalid token", "Nädogry token"},
+ {"SUCCESS", "Üstünlikli"},
+ {"Stream closed", "Strim ýapyk"},
+ {"Stream not found or already was closed", "Strim tapylmady ýa-da eýýäm ýapyldy"},
+ {"Destination not found", "Niýetlenen ýeri tapylmady"},
+ {"StreamID can't be null", "StreamID boş bolup bilmez"},
+ {"Return to destination page", "Barmaly nokadynyň nokadyna gaýdyp geliň"},
+ {"You will be redirected in 5 seconds", "5 sekuntdan soň täzeden ugrukdyrylarsyňyz"},
+ {"Transit tunnels count must not exceed 65535", "Tranzit tagtalaryň sany 65535-den geçmeli däldir"},
+ {"Back to commands list", "Topar sanawyna dolan"},
+ {"Register at reg.i2p", "Reg.i2P-de hasaba duruň"},
+ {"Description", "Beýany"},
+ {"A bit information about service on domain", "Domendäki hyzmat barada käbir maglumatlar"},
+ {"Submit", "Iber"},
+ {"Domain can't end with .b32.i2p", "Domain .b32.i2p bilen gutaryp bilmez"},
+ {"Domain must end with .i2p", "Domeni .i2p bilen gutarmaly"},
+ {"Such destination is not found", "Bu barmaly ýer tapylmady"},
+ {"Unknown command", "Näbelli topar"},
+ {"Command accepted", "Topar kabul edilýär"},
{"Proxy error", "Proksi ýalňyşlygy"},
{"Proxy info", "Proksi maglumat"},
{"Proxy error: Host not found", "Proksi ýalňyşlygy: Host tapylmady"},
@@ -39,12 +168,11 @@ namespace turkmen // language
{"addresshelper is not supported", "Salgylandyryjy goldanok"},
{"Host", "Adres"},
{"added to router's addressbook from helper", "marşruteriň adresini kömekçiden goşdy"},
- {"already in router's addressbook", "marşruteriň adres kitaby"},
- {"Click", "Basyň"},
- {"here", "bu ýerde"},
- {"to proceed", "dowam etmek"},
- {"to update record", "recordazgyny täzelemek üçin"},
+ {"Click here to proceed:", "Dowam etmek bu ýerde basyň:"},
+ {"Continue", "Dowam et"},
{"Addresshelper found", "Forgelper tapyldy"},
+ {"already in router's addressbook", "marşruteriň adres kitaby"},
+ {"Click here to update record:", "Recordazgyny täzelemek üçin bu ýerde basyň:"},
{"invalid request uri", "nädogry haýyş URI"},
{"Can't detect destination host from request", "Haýyşdan barmaly ýerini tapyp bilemok"},
{"Outproxy failure", "Daşarky proksi ýalňyşlyk"},
@@ -64,161 +192,7 @@ namespace turkmen // language
{"http out proxy not implemented", "daşarky HTTP proksi serwerini goldamak amala aşyrylmaýar"},
{"cannot connect to upstream http proxy", "ýokary akym HTTP proksi serwerine birigip bilmedi"},
{"Host is down", "Salgy elýeterli däl"},
- {"Can't create connection to requested host, it may be down. Please try again later.",
- "Talap edilýän salgyda birikmäni gurup bilmedim, onlaýn bolup bilmez. Soňra haýyşy soň gaýtalamaga synanyşyň."},
-
- // Webconsole //
- // cssStyles
- {"Disabled", "Öçürildi"},
- {"Enabled", "Goşuldy"},
- // ShowTraffic
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
- // ShowTunnelDetails
- {"building", "bina"},
- {"failed", "şowsuz"},
- {"expiring", "möhleti gutarýar"},
- {"established", "işleýär"},
- {"exploratory", "gözleg"},
- {"unknown", "näbelli"},
- {"i2pd webconsole", "Web konsoly i2pd"},
- // ShowPageHead
- {"Main page", "Esasy sahypa"},
- {"Router commands", "Marşrutizator buýruklary"},
- {"Local destinations", "Ýerli ýerler"},
- {"LeaseSets", "Lizset"},
- {"Tunnels", "Tuneller"},
- {"Transit tunnels", "Tranzit tunels"},
- {"Transports", "Daşamak"},
- {"I2P tunnels", "I2P tuneller"},
- {"SAM sessions", "SAM Sessiýasy"},
- // Network Status
- {"OK", "OK"},
- {"Testing", "Synag etmek"},
- {"Firewalled", "Daşynda petiklendi"},
- {"Unknown", "Näbelli"},
- {"Proxy", "Proksi"},
- {"Mesh", "MESH-tor"},
- {"Error", "Ýalňyşlyk"},
- {"Clock skew", "Takyk wagt däl"},
- {"Offline", "Awtonom"},
- {"Symmetric NAT", "Simmetriklik NAT"},
- // Status
- {"Uptime", "Onlaýn onlaýn sözlügi"},
- {"Network status", "Tor ýagdaýy"},
- {"Network status v6", "Tor ýagdaýy v6"},
- {"Stopping in", "Soň duruň"},
- {"Family", "Maşgala"},
- {"Tunnel creation success rate", "Gurlan teneller üstünlikli gurlan teneller"},
- {"Received", "Alnan"},
- {"Sent", "Ýerleşdirildi"},
- {"Transit", "Tranzit"},
- {"KiB/s", "KiB/s"},
- {"Data path", "Maglumat ýoly"},
- {"Hidden content. Press on text to see.", "Gizlin mazmun. Görkezmek üçin tekste basyň."},
- {"Router Ident", "Marşrutly kesgitleýji"},
- {"Router Family", "Marşrutler maşgalasy"},
- {"Router Caps", "Baýdaklar marşruteri"},
- {"Version", "Wersiýasy"},
- {"Our external address", "Daşarky salgymyz"},
- {"supported", "goldanýar"},
- {"Routers", "Marşrutizatorlar"},
- {"Floodfills", "Fludfillar"},
- {"Client Tunnels", "Müşderi tunelleri"},
- {"Transit Tunnels", "Tranzit Tunelleri"},
- {"Services", "Hyzmatlar"},
- // ShowLocalDestinations
- {"Local Destinations", "Ýerli ýerler"},
- // ShowLeaseSetDestination
- {"Encrypted B33 address", "Şifrlenen B33 salgylar"},
- {"Address registration line", "Hasaba alyş salgysy"},
- {"Domain", "Domen"},
- {"Generate", "Öndürmek"},
- {"Note: result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.",
- "Bellik: Alnan setir diňe ikinji derejeli domenleri bellige almak üçin ulanylyp bilner. Subýutmalary hasaba almak üçin i2pd ulanyň-tools."},
- {"Address", "Salgysy"},
- {"Type", "Görnüş"},
- {"EncType", "Şifrlemek görnüşi"},
- {"Inbound tunnels", "Gelýän tuneller"},
- {"Outbound tunnels", "Çykýan tuneller"},
- {"ms", "ms"}, // milliseconds
- {"Tags", "Bellikler"},
- {"Incoming", "Gelýän"},
- {"Outgoing", "Çykýan"},
- {"Destination", "Maksat"},
- {"Amount", "Sany"},
- {"Incoming Tags", "Gelýän bellikler"},
- {"Tags sessions", "Sapaklar bellikler"},
- {"Status", "Ýagdaýy"},
- // ShowLocalDestination
- {"Local Destination", "Ýerli maksat"},
- {"Streams", "Strimlary"},
- {"Close stream", "Yap strim"},
- // ShowI2CPLocalDestination
- {"I2CP session not found", "I2CP Sessiýa tapylmady"},
- {"I2CP is not enabled", "I2CP goşulmaýar"},
- // ShowLeasesSets
- {"Invalid", "Nädogry"},
- {"Store type", "Ammar görnüşi"},
- {"Expires", "Möhleti gutarýar"},
- {"Non Expired Leases", "Möhleti gutarmady Lizsetlary"},
- {"Gateway", "Derweze"},
- {"TunnelID", "Tuneliň ID"},
- {"EndDate", "Gutarýar"},
- {"not floodfill", "fludfil däl"},
- // ShowTunnels
- {"Queue size", "Nobatyň ululygy"},
- // ShowCommands
- {"Run peer test", "Synag başlaň"},
- {"Decline transit tunnels", "Tranzit tunellerini ret ediň"},
- {"Accept transit tunnels", "Tranzit tunellerini alyň"},
- {"Cancel graceful shutdown", "Tekiz durmagy ýatyryň"},
- {"Start graceful shutdown", "Tekiz durmak"},
- {"Force shutdown", "Mejbury duralga"},
- {"Note: any action done here are not persistent and not changes your config files.",
- "Bellik: Bu ýerde öndürilen islendik çäre hemişelik däl we konfigurasiýa faýllaryňyzy üýtgetmeýär."},
- {"Logging level", "Giriş derejesi"},
- {"Transit tunnels limit", "Tranzit tunelleriniň çägi"},
- {"Change", "Üýtgetmek"},
- // ShowTransitTunnels
- {"no transit tunnels currently built", "gurlan tranzit tunelleri ýok"},
- // ShowSAMSessions/ShowSAMSession
- {"SAM disabled", "SAM öçürilen"},
- {"SAM session not found", "SAM Sessiýa tapylmady"},
- {"no sessions currently running", "başlamagyň sessiýalary ýok"},
- {"SAM Session", "SAM Sessiýa"},
- // ShowI2PTunnels
- {"Server Tunnels", "Serwer tunelleri"},
- {"Client Forwards", "Müşderi gönükdirýär"},
- {"Server Forwards", "Serweriň täzeden düzlüleri"},
- // HandlePage
- {"Unknown page", "Näbelli sahypa"},
- // HandleCommand, ShowError
- {"Invalid token", "Nädogry token"},
- {"SUCCESS", "Üstünlikli"},
- {"ERROR", "Ýalňyşlyk"},
- {"Unknown command", "Näbelli topar"},
- {"Command accepted", "Topar kabul edilýär"},
- {"Back to commands list", "Topar sanawyna dolan"},
- {"You will be redirected in 5 seconds", "5 sekuntdan soň täzeden ugrukdyrylarsyňyz"},
- // HTTP_COMMAND_KILLSTREAM
- {"Stream closed", "Strim ýapyk"},
- {"Stream not found or already was closed", "Strim tapylmady ýa-da eýýäm ýapyldy"},
- {"Destination not found", "Niýetlenen ýeri tapylmady"},
- {"StreamID can't be null", "StreamID boş bolup bilmez"},
- {"Return to destination page", "Barmaly nokadynyň nokadyna gaýdyp geliň"},
- {"You will be redirected back in 5 seconds", "5 sekuntda yzyna iberiler"},
- // HTTP_COMMAND_LIMITTRANSIT
- {"Transit tunnels count must not exceed 65535", "Tranzit tagtalaryň sany 65535-den geçmeli däldir"},
- // HTTP_COMMAND_GET_REG_STRING
- {"Register at reg.i2p", "Reg.i2P-de hasaba duruň"},
- {"Description", "Beýany"},
- {"A bit information about service on domain", "Domendäki hyzmat barada käbir maglumatlar"},
- {"Submit", "Iber"},
- {"Domain can't end with .b32.i2p", "Domain .b32.i2p bilen gutaryp bilmez"},
- {"Domain must end with .i2p", "Domeni .i2p bilen gutarmaly"},
- {"Such destination is not found", "Bu barmaly ýer tapylmady"},
+ {"Can't create connection to requested host, it may be down. Please try again later.", "Talap edilýän salgyda birikmäni gurup bilmedim, onlaýn bolup bilmez. Soňra haýyşy soň gaýtalamaga synanyşyň."},
{"", ""},
};
@@ -234,7 +208,7 @@ namespace turkmen // language
std::shared_ptr GetLocale()
{
- return std::make_shared(strings, plurals, [] (int n)->int { return plural(n); });
+ return std::make_shared(language, strings, plurals, [] (int n)->int { return plural(n); });
}
} // language
diff --git a/i18n/Ukrainian.cpp b/i18n/Ukrainian.cpp
index 11878cde..abbe8f81 100644
--- a/i18n/Ukrainian.cpp
+++ b/i18n/Ukrainian.cpp
@@ -18,8 +18,11 @@ namespace i2p
{
namespace i18n
{
-namespace ukrainian // language
+namespace ukrainian // language namespace
{
+ // language name in lowercase
+ static std::string language = "ukrainian";
+
// See for language plural forms here:
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
static int plural (int n) {
@@ -28,23 +31,148 @@ namespace ukrainian // language
static std::map strings
{
- // HTTP Proxy
+ {"KiB", "КіБ"},
+ {"MiB", "МіБ"},
+ {"GiB", "ГіБ"},
+ {"building", "будується"},
+ {"failed", "невдалий"},
+ {"expiring", "завершується"},
+ {"established", "працює"},
+ {"unknown", "невідомо"},
+ {"exploratory", "дослідницький"},
+ {"i2pd webconsole", "Веб-консоль i2pd"},
+ {"Main page", "Головна"},
+ {"Router commands", "Команди маршрутизатора"},
+ {"Local Destinations", "Локальні Призначення"},
+ {"LeaseSets", "Лізсети"},
+ {"Tunnels", "Тунелі"},
+ {"Transit Tunnels", "Транзитні Тунелі"},
+ {"Transports", "Транспорти"},
+ {"I2P tunnels", "I2P тунелі"},
+ {"SAM sessions", "SAM сесії"},
+ {"ERROR", "ПОМИЛКА"},
+ {"OK", "OK"},
+ {"Testing", "Тестування"},
+ {"Firewalled", "Заблоковано ззовні"},
+ {"Unknown", "Невідомо"},
+ {"Proxy", "Проксі"},
+ {"Mesh", "MESH-мережа"},
+ {"Error", "Помилка"},
+ {"Clock skew", "Неточний час"},
+ {"Offline", "Офлайн"},
+ {"Symmetric NAT", "Симетричний NAT"},
+ {"Uptime", "У мережі"},
+ {"Network status", "Мережевий статус"},
+ {"Network status v6", "Мережевий статус v6"},
+ {"Stopping in", "Зупинка через"},
+ {"Family", "Сімейство"},
+ {"Tunnel creation success rate", "Успішно побудованих тунелів"},
+ {"Received", "Отримано"},
+ {"KiB/s", "КіБ/с"},
+ {"Sent", "Відправлено"},
+ {"Transit", "Транзит"},
+ {"Data path", "Шлях до даних"},
+ {"Hidden content. Press on text to see.", "Прихований вміст. Щоб відобразити, натисніть на текст."},
+ {"Router Ident", "Ідентифікатор маршрутизатора"},
+ {"Router Family", "Сімейство маршрутизатора"},
+ {"Router Caps", "Прапорці маршрутизатора"},
+ {"Version", "Версія"},
+ {"Our external address", "Наша зовнішня адреса"},
+ {"supported", "підтримується"},
+ {"Routers", "Маршрутизатори"},
+ {"Floodfills", "Флудфіли"},
+ {"Client Tunnels", "Клієнтські Тунелі"},
+ {"Services", "Сервіси"},
+ {"Enabled", "Увімкнуто"},
+ {"Disabled", "Вимкнуто"},
+ {"Encrypted B33 address", "Шифровані B33 адреси"},
+ {"Address registration line", "Рядок реєстрації адреси"},
+ {"Domain", "Домен"},
+ {"Generate", "Згенерувати"},
+ {"Note: result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "Примітка: отриманий рядок може бути використаний тільки для реєстрації доменів другого рівня (example.i2p). Для реєстрації піддоменів використовуйте i2pd-tools."},
+ {"Address", "Адреса"},
+ {"Type", "Тип"},
+ {"EncType", "ТипШифр"},
+ {"Inbound tunnels", "Вхідні тунелі"},
+ {"ms", "мс"},
+ {"Outbound tunnels", "Вихідні тунелі"},
+ {"Tags", "Теги"},
+ {"Incoming", "Вхідні"},
+ {"Outgoing", "Вихідні"},
+ {"Destination", "Призначення"},
+ {"Amount", "Кількість"},
+ {"Incoming Tags", "Вхідні Теги"},
+ {"Tags sessions", "Сесії Тегів"},
+ {"Status", "Статус"},
+ {"Local Destination", "Локальні Призначення"},
+ {"Streams", "Потоки"},
+ {"Close stream", "Закрити потік"},
+ {"I2CP session not found", "I2CP сесія не знайдена"},
+ {"I2CP is not enabled", "I2CP не увікнуто"},
+ {"Invalid", "Некоректний"},
+ {"Store type", "Тип сховища"},
+ {"Expires", "Завершується"},
+ {"Non Expired Leases", "Не завершені Lease-и"},
+ {"Gateway", "Шлюз"},
+ {"TunnelID", "ID тунеля"},
+ {"EndDate", "Закінчується"},
+ {"not floodfill", "не флудфіл"},
+ {"Queue size", "Розмір черги"},
+ {"Run peer test", "Запустити тестування"},
+ {"Decline transit tunnels", "Відхиляти транзитні тунелі"},
+ {"Accept transit tunnels", "Ухвалювати транзитні тунелі"},
+ {"Cancel graceful shutdown", "Скасувати плавну зупинку"},
+ {"Start graceful shutdown", "Запустити плавну зупинку"},
+ {"Force shutdown", "Примусова зупинка"},
+ {"Reload external CSS styles", "Перезавантажити зовнішні стилі CSS"},
+ {"Note: any action done here are not persistent and not changes your config files.", "Примітка: будь-яка зроблена тут дія не є постійною та не змінює ваші конфігураційні файли."},
+ {"Logging level", "Рівень логування"},
+ {"Transit tunnels limit", "Обмеження транзитних тунелів"},
+ {"Change", "Змінити"},
+ {"Change language", "Змінити мову"},
+ {"no transit tunnels currently built", "немає побудованих транзитних тунелів"},
+ {"SAM disabled", "SAM вимкнуто"},
+ {"no sessions currently running", "немає запущених сесій"},
+ {"SAM session not found", "SAM сесія не знайдена"},
+ {"SAM Session", "SAM сесія"},
+ {"Server Tunnels", "Серверні Тунелі"},
+ {"Client Forwards", "Клієнтські Переспрямування"},
+ {"Server Forwards", "Серверні Переспрямування"},
+ {"Unknown page", "Невідома сторінка"},
+ {"Invalid token", "Невірний токен"},
+ {"SUCCESS", "УСПІШНО"},
+ {"Stream closed", "Потік зачинений"},
+ {"Stream not found or already was closed", "Потік не знайдений або вже зачинений"},
+ {"Destination not found", "Точка призначення не знайдена"},
+ {"StreamID can't be null", "Ідентифікатор потоку не може бути порожнім"},
+ {"Return to destination page", "Повернутися на сторінку точки призначення"},
+ {"You will be redirected in 5 seconds", "Ви будете переадресовані через 5 секунд"},
+ {"Transit tunnels count must not exceed 65535", "Кількість транзитних тунелів не повинна перевищувати 65535"},
+ {"Back to commands list", "Повернутися до списку команд"},
+ {"Register at reg.i2p", "Зареєструвати на reg.i2p"},
+ {"Description", "Опис"},
+ {"A bit information about service on domain", "Трохи інформації про сервіс на домені"},
+ {"Submit", "Надіслати"},
+ {"Domain can't end with .b32.i2p", "Домен не може закінчуватися на .b32.i2p"},
+ {"Domain must end with .i2p", "Домен повинен закінчуватися на .i2p"},
+ {"Such destination is not found", "Така точка призначення не знайдена"},
+ {"Unknown command", "Невідома команда"},
+ {"Command accepted", "Команда прийнята"},
{"Proxy error", "Помилка проксі"},
{"Proxy info", "Інформація проксі"},
{"Proxy error: Host not found", "Помилка проксі: Адреса не знайдена"},
- {"Remote host not found in router's addressbook", "Віддалена адреса не знайдена в адресній книзі роутера"},
+ {"Remote host not found in router's addressbook", "Віддалена адреса не знайдена в адресній книзі маршрутизатора"},
{"You may try to find this host on jump services below", "Ви можете спробувати знайти дану адресу на джамп сервісах нижче"},
{"Invalid request", "Некоректний запит"},
{"Proxy unable to parse your request", "Проксі не може розібрати ваш запит"},
{"addresshelper is not supported", "addresshelper не підтримується"},
{"Host", "Адреса"},
- {"added to router's addressbook from helper", "доданий в адресну книгу роутера через хелпер"},
- {"already in router's addressbook", "вже в адресній книзі роутера"},
- {"Click", "Натисніть"},
- {"here", "тут"},
- {"to proceed", "щоб продовжити"},
- {"to update record", "щоб оновити запис"},
+ {"added to router's addressbook from helper", "доданий в адресну книгу маршрутизатора через хелпер"},
+ {"Click here to proceed:", "Натисніть тут щоб продовжити:"},
+ {"Continue", "Продовжити"},
{"Addresshelper found", "Знайдено addresshelper"},
+ {"already in router's addressbook", "вже в адресній книзі маршрутизатора"},
+ {"Click here to update record:", "Натисніть тут щоб оновити запис:"},
{"invalid request uri", "некоректний URI запиту"},
{"Can't detect destination host from request", "Не вдалось визначити адресу призначення з запиту"},
{"Outproxy failure", "Помилка зовнішнього проксі"},
@@ -64,169 +192,14 @@ namespace ukrainian // language
{"http out proxy not implemented", "підтримка зовнішнього HTTP проксі сервера не реалізована"},
{"cannot connect to upstream http proxy", "не вдалося підключитися до висхідного HTTP проксі сервера"},
{"Host is down", "Вузол недоступний"},
- {"Can't create connection to requested host, it may be down. Please try again later.",
- "Не вдалося встановити з'єднання до запитаного вузла, можливо він не в мережі. Спробуйте повторити запит пізніше."},
-
- // Webconsole //
- // cssStyles
- {"Disabled", "Вимкнуто"},
- {"Enabled", "Увімкнуто"},
- // ShowTraffic
- {"KiB", "КіБ"},
- {"MiB", "МіБ"},
- {"GiB", "ГіБ"},
- // ShowTunnelDetails
- {"building", "будується"},
- {"failed", "невдалий"},
- {"expiring", "завершується"},
- {"established", "працює"},
- {"exploratory", "дослідницький"},
- {"unknown", "невідомо"},
- {"i2pd webconsole", "Веб-консоль i2pd"},
- // ShowPageHead
- {"Main page", "Головна"},
- {"Router commands", "Команди роутера"},
- {"Local destinations", "Локальні призначення"},
- {"LeaseSets", "Лізсети"},
- {"Tunnels", "Тунелі"},
- {"Transit tunnels", "Транзитні тунелі"},
- {"Transports", "Транспорти"},
- {"I2P tunnels", "I2P тунелі"},
- {"SAM sessions", "SAM сесії"},
- // Network Status
- {"OK", "OK"},
- {"Testing", "Тестування"},
- {"Firewalled", "Заблоковано ззовні"},
- {"Unknown", "Невідомо"},
- {"Proxy", "Проксі"},
- {"Mesh", "MESH-мережа"},
- {"Error", "Помилка"},
- {"Clock skew", "Неточний час"},
- {"Offline", "Офлайн"},
- {"Symmetric NAT", "Симетричний NAT"},
- // Status
- {"Uptime", "В мережі"},
- {"Network status", "Мережевий статус"},
- {"Network status v6", "Мережевий статус v6"},
- {"Stopping in", "Зупинка через"},
- {"Family", "Сімейство"},
- {"Tunnel creation success rate", "Успішно побудованих тунелів"},
- {"Received", "Отримано"},
- {"Sent", "Відправлено"},
- {"Transit", "Транзит"},
- {"KiB/s", "КіБ/с"},
- {"Data path", "Шлях до даних"},
- {"Hidden content. Press on text to see.", "Прихований вміст. Натисніть на текст щоб відобразити."},
- {"Router Ident", "Ідентифікатор Роутера"},
- {"Router Family", "Сімейство Роутера"},
- {"Router Caps", "Прапорці Роутера"},
- {"Version", "Версія"},
- {"Our external address", "Наша зовнішня адреса"},
- {"supported", "підтримується"},
- {"Routers", "Роутери"},
- {"Floodfills", "Флудфіли"},
- {"Client Tunnels", "Клієнтські Тунелі"},
- {"Transit Tunnels", "Транзитні Тунелі"},
- {"Services", "Сервіси"},
- // ShowLocalDestinations
- {"Local Destinations", "Локальні Призначення"},
- // ShowLeaseSetDestination
- {"Encrypted B33 address", "Шифровані B33 адреси"},
- {"Address registration line", "Рядок реєстрації адреси"},
- {"Domain", "Домен"},
- {"Generate", "Згенерувати"},
- {"Note: result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.",
- "Примітка: отриманий рядок може бути використаний тільки для реєстрації доменів другого рівня. Для реєстрації піддоменів використовуйте i2pd-tools."},
- {"Address", "Адреса"},
- {"Type", "Тип"},
- {"EncType", "ТипШифр"},
- {"Inbound tunnels", "Вхідні тунелі"},
- {"Outbound tunnels", "Вихідні тунелі"},
- {"ms", "мс"}, // milliseconds
- {"Tags", "Теги"},
- {"Incoming", "Вхідні"},
- {"Outgoing", "Вихідні"},
- {"Destination", "Призначення"},
- {"Amount", "Кількість"},
- {"Incoming Tags", "Вхідні Теги"},
- {"Tags sessions", "Сесії тегів"},
- {"Status", "Статус"},
- // ShowLocalDestination
- {"Local Destination", "Локальні Призначення"},
- {"Streams", "Потоки"},
- {"Close stream", "Закрити потік"},
- // ShowI2CPLocalDestination
- {"I2CP session not found", "I2CP сесія не знайдена"},
- {"I2CP is not enabled", "I2CP не увікнуто"},
- // ShowLeasesSets
- {"Invalid", "Некоректний"},
- {"Store type", "Тип сховища"},
- {"Expires", "Завершується"},
- {"Non Expired Leases", "Не завершені Lease-и"},
- {"Gateway", "Шлюз"},
- {"TunnelID", "ID тунеля"},
- {"EndDate", "Закінчується"},
- {"not floodfill", "не флудфіл"},
- // ShowTunnels
- {"Queue size", "Розмір черги"},
- // ShowCommands
- {"Run peer test", "Запустити тестування"},
- {"Decline transit tunnels", "Відхиляти транзитні тунелі"},
- {"Accept transit tunnels", "Ухвалювати транзитні тунелі"},
- {"Cancel graceful shutdown", "Скасувати плавну зупинку"},
- {"Start graceful shutdown", "Запустити плавну зупинку"},
- {"Force shutdown", "Примусова зупинка"},
- {"Note: any action done here are not persistent and not changes your config files.",
- "Примітка: будь-яка зроблена тут дія не є постійною та не змінює ваші конфігураційні файли."},
- {"Logging level", "Рівень логування"},
- {"Transit tunnels limit", "Обмеження транзитних тунелів"},
- {"Change", "Змінити"},
- // ShowTransitTunnels
- {"no transit tunnels currently built", "немає побудованих транзитних тунелів"},
- // ShowSAMSessions/ShowSAMSession
- {"SAM disabled", "SAM вимкнуто"},
- {"SAM session not found", "SAM сесія не знайдена"},
- {"no sessions currently running", "немає запущених сесій"},
- {"SAM Session", "SAM сесія"},
- // ShowI2PTunnels
- {"Server Tunnels", "Серверні Тунелі"},
- {"Client Forwards", "Клієнтські Переспрямування"},
- {"Server Forwards", "Серверні Переспрямування"},
- // HandlePage
- {"Unknown page", "Невідома сторінка"},
- // HandleCommand, ShowError
- {"Invalid token", "Невірний токен"},
- {"SUCCESS", "УСПІШНО"},
- {"ERROR", "ПОМИЛКА"},
- {"Unknown command", "Невідома команда"},
- {"Command accepted", "Команда прийнята"},
- {"Back to commands list", "Повернутися до списку команд"},
- {"You will be redirected in 5 seconds", "Ви будете переадресовані через 5 секунд"},
- // HTTP_COMMAND_KILLSTREAM
- {"Stream closed", "Потік зачинений"},
- {"Stream not found or already was closed", "Потік не знайдений або вже зачинений"},
- {"Destination not found", "Точка призначення не знайдена"},
- {"StreamID can't be null", "Ідентифікатор потоку не може бути порожнім"},
- {"Return to destination page", "Повернутися на сторінку точки призначення"},
- {"You will be redirected back in 5 seconds", "Ви будете переадресовані назад через 5 секунд"},
- // HTTP_COMMAND_LIMITTRANSIT
- {"Transit tunnels count must not exceed 65535", "Кількість транзитних тунелів не повинна перевищувати 65535"},
- // HTTP_COMMAND_GET_REG_STRING
- {"Register at reg.i2p", "Зареєструвати на reg.i2p"},
- {"Description", "Опис"},
- {"A bit information about service on domain", "Трохи інформації про сервіс на домені"},
- {"Submit", "Надіслати"},
- {"Domain can't end with .b32.i2p", "Домен не може закінчуватися на .b32.i2p"},
- {"Domain must end with .i2p", "Домен повинен закінчуватися на .i2p"},
- {"Such destination is not found", "Така точка призначення не знайдена"},
+ {"Can't create connection to requested host, it may be down. Please try again later.", "Не вдалося встановити з'єднання до запитаного вузла, можливо він не в мережі. Спробуйте повторити запит пізніше."},
{"", ""},
};
static std::map> plurals
{
- // ShowUptime
- {"days", {"день", "дня", "днів"}},
- {"hours", {"годину", "години", "годин"}},
+ {"days", {"день", "дня", "днів"}},
+ {"hours", {"годину", "години", "годин"}},
{"minutes", {"хвилину", "хвилини", "хвилин"}},
{"seconds", {"секунду", "секунди", "секунд"}},
{"", {"", "", ""}},
@@ -234,7 +207,7 @@ namespace ukrainian // language
std::shared_ptr GetLocale()
{
- return std::make_shared(strings, plurals, [] (int n)->int { return plural(n); });
+ return std::make_shared(language, strings, plurals, [] (int n)->int { return plural(n); });
}
} // language
diff --git a/i18n/Uzbek.cpp b/i18n/Uzbek.cpp
new file mode 100644
index 00000000..72734b58
--- /dev/null
+++ b/i18n/Uzbek.cpp
@@ -0,0 +1,206 @@
+/*
+* Copyright (c) 2021, The PurpleI2P Project
+*
+* This file is part of Purple i2pd project and licensed under BSD3
+*
+* See full license text in LICENSE file at top of project tree
+*/
+
+#include