diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp
index dcd4f7f7..74e7df64 100644
--- a/daemon/HTTPServer.cpp
+++ b/daemon/HTTPServer.cpp
@@ -103,18 +103,18 @@ namespace http {
int num;
if ((num = seconds / 86400) > 0) {
- s << num << " " << tr("day", "days", num) << ", ";
+ s << ntr("%d day", "%d days", num, num) << ", ";
seconds -= num * 86400;
}
if ((num = seconds / 3600) > 0) {
- s << num << " " << tr("hour", "hours", num) << ", ";
+ s << ntr("%d hour", "%d hours", num, num) << ", ";
seconds -= num * 3600;
}
if ((num = seconds / 60) > 0) {
- s << num << " " << tr("minute", "minutes", num) << ", ";
+ s << ntr("%d minute", "%d minutes", num, num) << ", ";
seconds -= num * 60;
}
- s << seconds << " " << tr("second", "seconds", seconds);
+ s << ntr("%d second", "%d seconds", seconds, seconds);
}
static void ShowTraffic (std::stringstream& s, uint64_t bytes)
@@ -122,11 +122,11 @@ namespace http {
s << std::fixed << std::setprecision(2);
auto numKBytes = (double) bytes / 1024;
if (numKBytes < 1024)
- s << numKBytes << " " << tr(/* tr: Kibibit */ "KiB");
+ s << tr(/* tr: Kibibyte */ "%.2f KiB", numKBytes);
else if (numKBytes < 1024 * 1024)
- s << numKBytes / 1024 << " " << tr(/* tr: Mebibit */ "MiB");
+ s << tr(/* tr: Mebibyte */ "%.2f MiB", numKBytes / 1024);
else
- s << numKBytes / 1024 / 1024 << " " << tr(/* tr: Gibibit */ "GiB");
+ s << tr(/* tr: Gibibyte */ "%.2f GiB", numKBytes / 1024 / 1024);
}
static void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, bool explr, int bytes)
@@ -150,7 +150,7 @@ namespace http {
else stateText = tr("unknown");
s << " " << stateText << ((explr) ? " (" + tr("exploratory") + ")" : "") << " , ";
- s << " " << (int) (bytes / 1024) << " " << tr(/* tr: Kibibit */ "KiB") << "\r\n";
+ s << " " << tr(/* tr: Kibibit */ "%.2f KiB", (double) bytes / 1024) << "\r\n";
}
static void SetLogLevel (const std::string& level)
@@ -247,7 +247,7 @@ namespace http {
break;
case eRouterErrorFullConeNAT:
s << " - " << tr("Full cone NAT");
- break;
+ break;
case eRouterErrorNoDescriptors:
s << " - " << tr("No Descriptors");
break;
@@ -290,13 +290,13 @@ namespace http {
s << "" << tr("Tunnel creation success rate") << ": " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "% \r\n";
s << "" << tr("Received") << ": ";
ShowTraffic (s, i2p::transport::transports.GetTotalReceivedBytes ());
- s << " (" << (double) i2p::transport::transports.GetInBandwidth15s () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ") \r\n";
+ s << " (" << tr(/* tr: Kibibit/s */ "%.2f KiB/s", (double) i2p::transport::transports.GetInBandwidth15s () / 1024) << ") \r\n";
s << "" << tr("Sent") << ": ";
ShowTraffic (s, i2p::transport::transports.GetTotalSentBytes ());
- s << " (" << (double) i2p::transport::transports.GetOutBandwidth15s () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ") \r\n";
+ s << " (" << tr(/* tr: Kibibit/s */ "%.2f KiB/s", (double) i2p::transport::transports.GetOutBandwidth15s () / 1024) << ") \r\n";
s << "" << tr("Transit") << ": ";
ShowTraffic (s, i2p::transport::transports.GetTotalTransitTransmittedBytes ());
- s << " (" << (double) i2p::transport::transports.GetTransitBandwidth15s () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ") \r\n";
+ s << " (" << tr(/* tr: Kibibit/s */ "%.2f KiB/s", (double) i2p::transport::transports.GetTransitBandwidth15s () / 1024) << ") \r\n";
s << "" << tr("Data path") << ": " << i2p::fs::GetUTF8DataDir() << " \r\n";
s << "
";
if ((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) {
@@ -338,7 +338,7 @@ namespace http {
s << "
" << address->host.to_string() << ":" << address->port << " \r\n";
else
{
- s << "" << tr("supported");
+ s << " " << tr(/* tr: Shown when router doesn't publish itself and have "Firewalled" state */ "supported");
if (address->port)
s << " :" << address->port;
s << " \r\n";
@@ -466,7 +466,7 @@ namespace http {
}
s << "⇒ " << it->GetTunnelID () << ":me";
if (it->LatencyIsKnown())
- s << " ( " << it->GetMeanLatency() << tr(/* tr: Milliseconds */ "ms") << " )";
+ s << " ( " << tr(/* tr: Milliseconds */ "%dms", it->GetMeanLatency()) << " )";
ShowTunnelDetails(s, it->GetState (), false, it->GetNumReceivedBytes ());
s << "\r\n";
}
@@ -486,22 +486,26 @@ namespace http {
);
}
if (it->LatencyIsKnown())
- s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
+ s << " ( " << tr("%dms", it->GetMeanLatency()) << " )";
ShowTunnelDetails(s, it->GetState (), false, it->GetNumSentBytes ());
s << "\r\n";
}
}
s << " \r\n";
- s << "" << tr("Tags") << " \r\n" << tr("Incoming") << ": " << dest->GetNumIncomingTags () << " \r\n";
+ s << "" << tr("Tags") << " \r\n"
+ << tr("Incoming") << ": " << dest->GetNumIncomingTags () << " \r\n";
if (!dest->GetSessions ().empty ()) {
std::stringstream tmp_s; uint32_t out_tags = 0;
for (const auto& it: dest->GetSessions ()) {
tmp_s << "" << i2p::client::context.GetAddressBook ().ToAddress(it.first) << " " << it.second->GetNumOutgoingTags () << " \r\n";
out_tags += it.second->GetNumOutgoingTags ();
}
- s << "" << tr("Outgoing") << ": " << out_tags << " \r\n
\r\n"
- << "
\r\n
\r\n" << tr("Destination") << " " << tr("Amount") << " \r\n\r\n" << tmp_s.str () << "
\r\n
\r\n
\r\n";
+ s << "" << tr("Outgoing") << ": " << out_tags << " \r\n"
+ << "
\r\n"
+ << "
\r\n"
+ << "
\r\n" << tr("Destination") << " " << tr("Amount") << " \r\n"
+ << "\r\n" << tmp_s.str () << "
\r\n
\r\n
\r\n";
} else
s << tr("Outgoing") << ": 0 \r\n";
s << " \r\n";
@@ -516,8 +520,11 @@ namespace http {
tmp_s << "" << i2p::client::context.GetAddressBook ().ToAddress(it.second->GetDestination ()) << " " << it.second->GetState () << " \r\n";
ecies_sessions++;
}
- s << "" << tr("Tags sessions") << ": " << ecies_sessions << " \r\n
\r\n"
- << "
\r\n
\r\n" << tr("Destination") << " " << tr("Status") << " \r\n\r\n" << tmp_s.str () << "
\r\n
\r\n
\r\n";
+ s << "" << tr("Tags sessions") << ": " << ecies_sessions << " \r\n"
+ << "
\r\n"
+ << "
\r\n
\r\n"
+ << "" << tr("Destination") << " " << tr("Status") << " \r\n"
+ << "\r\n" << tmp_s.str () << "
\r\n
\r\n
\r\n";
} else
s << tr("Tags sessions") << ": 0 \r\n";
s << " \r\n";
@@ -671,7 +678,7 @@ namespace http {
}
s << "⇒ " << it->GetTunnelID () << ":me";
if (it->LatencyIsKnown())
- s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
+ s << " ( " << tr("%dms", it->GetMeanLatency()) << " )";
ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumReceivedBytes ());
s << "\r\n";
}
@@ -691,7 +698,7 @@ namespace http {
);
}
if (it->LatencyIsKnown())
- s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
+ s << " ( " << tr("%dms", it->GetMeanLatency()) << " )";
ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumSentBytes ());
s << "\r\n";
}
diff --git a/i18n/Afrikaans.cpp b/i18n/Afrikaans.cpp
index 5860facf..b582a06a 100644
--- a/i18n/Afrikaans.cpp
+++ b/i18n/Afrikaans.cpp
@@ -64,10 +64,10 @@ namespace afrikaans // language namespace
static std::map> plurals
{
- {"days", {"dag", "dae"}},
- {"hours", {"uur", "ure"}},
- {"minutes", {"minuut", "minute"}},
- {"seconds", {"seconde", "sekondes"}},
+ {"%d days", {"%d dag", "%d dae"}},
+ {"%d hours", {"%d uur", "%d ure"}},
+ {"%d minutes", {"%d minuut", "%d minute"}},
+ {"%d seconds", {"%d seconde", "%d sekondes"}},
{"", {"", ""}},
};
diff --git a/i18n/Armenian.cpp b/i18n/Armenian.cpp
index 586e7579..a18d35fc 100644
--- a/i18n/Armenian.cpp
+++ b/i18n/Armenian.cpp
@@ -31,9 +31,9 @@ namespace armenian // language namespace
static std::map strings
{
- {"KiB", "ԿիԲ"},
- {"MiB", "ՄիԲ"},
- {"GiB", "ԳիԲ"},
+ {"%.2f KiB", "%.2f ԿիԲ"},
+ {"%.2f MiB", "%.2f ՄիԲ"},
+ {"%.2f GiB", "%.2f ԳիԲ"},
{"building", "կառուցվում է"},
{"failed", "Անհաջող"},
{"expiring", "Լրանում է"},
@@ -68,7 +68,7 @@ namespace armenian // language namespace
{"Family", "Խմբատեսակ"},
{"Tunnel creation success rate", "Հաջողությամբ կառուցված թունելներ"},
{"Received", "Ստացվել է"},
- {"KiB/s", "ԿիԲ/վ"},
+ {"%.2f KiB/s", "%.2f ԿիԲ/վ"},
{"Sent", "Ուղարկվել է"},
{"Transit", "Տարանցում"},
{"Data path", "Տվյալների ուղին"},
@@ -94,7 +94,7 @@ namespace armenian // language namespace
{"Type", "Տեսակը"},
{"EncType", "Գաղտնագրի տեսակը"},
{"Inbound tunnels", "Մուտքային թունելներ"},
- {"ms", "մլվ"},
+ {"%dms", "%dմլվ"},
{"Outbound tunnels", "Ելքային թունելներ"},
{"Tags", "Թեգեր"},
{"Incoming", "Մուտքային"},
@@ -198,10 +198,10 @@ namespace armenian // language namespace
static std::map> plurals
{
- {"days", {"օր", "օր"}},
- {"hours", {"ժամ", "ժամ"}},
- {"minutes", {"րոպե", "րոպե"}},
- {"seconds", {"վարկյան", "վարկյան"}},
+ {"%d days", {"%d օր", "%d օր"}},
+ {"%d hours", {"%d ժամ", "%d ժամ"}},
+ {"%d minutes", {"%d րոպե", "%d րոպե"}},
+ {"%d seconds", {"%d վարկյան", "%d վարկյան"}},
{"", {"", ""}},
};
diff --git a/i18n/Chinese.cpp b/i18n/Chinese.cpp
index 2f6c14e2..8a554a11 100644
--- a/i18n/Chinese.cpp
+++ b/i18n/Chinese.cpp
@@ -32,9 +32,9 @@ namespace chinese // language namespace
static std::map strings
{
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
+ {"%.2f KiB", "%.2f KiB"},
+ {"%.2f MiB", "%.2f MiB"},
+ {"%.2f GiB", "%.2f GiB"},
{"building", "正在构建"},
{"failed", "连接失败"},
{"expiring", "即将过期"},
@@ -70,7 +70,7 @@ namespace chinese // language namespace
{"Family", "家族"},
{"Tunnel creation success rate", "隧道创建成功率"},
{"Received", "已接收"},
- {"KiB/s", "KiB/s"},
+ {"%.2f KiB/s", "%.2f KiB/s"},
{"Sent", "已发送"},
{"Transit", "中转"},
{"Data path", "数据文件路径"},
@@ -96,7 +96,7 @@ namespace chinese // language namespace
{"Type", "类型"},
{"EncType", "加密类型"},
{"Inbound tunnels", "入站隧道"},
- {"ms", "毫秒"},
+ {"%dms", "%d毫秒"},
{"Outbound tunnels", "出站隧道"},
{"Tags", "标签"},
{"Incoming", "传入"},
@@ -200,10 +200,10 @@ namespace chinese // language namespace
static std::map> plurals
{
- {"days", {"日"}},
- {"hours", {"时"}},
- {"minutes", {"分"}},
- {"seconds", {"秒"}},
+ {"%d days", {"%d 日"}},
+ {"%d hours", {"%d 时"}},
+ {"%d minutes", {"%d 分"}},
+ {"%d seconds", {"%d 秒"}},
{"", {""}},
};
diff --git a/i18n/Czech.cpp b/i18n/Czech.cpp
index f6ac7188..93862053 100644
--- a/i18n/Czech.cpp
+++ b/i18n/Czech.cpp
@@ -31,9 +31,9 @@ namespace czech // language namespace
static std::map strings
{
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
+ {"%.2f KiB", "%.2f KiB"},
+ {"%.2f MiB", "%.2f MiB"},
+ {"%.2f GiB", "%.2f GiB"},
{"building", "vytváří se"},
{"failed", "selhalo"},
{"expiring", "končící"},
@@ -69,7 +69,7 @@ namespace czech // language namespace
{"Family", "Rodina"},
{"Tunnel creation success rate", "Úspěšnost vytváření tunelů"},
{"Received", "Přijato"},
- {"KiB/s", "KiB/s"},
+ {"%.2f KiB/s", "%.2f KiB/s"},
{"Sent", "Odesláno"},
{"Transit", "Tranzit"},
{"Data path", "Cesta k data souborům"},
@@ -95,7 +95,7 @@ namespace czech // language namespace
{"Type", "Typ"},
{"EncType", "EncType"},
{"Inbound tunnels", "Příchozí tunely"},
- {"ms", "ms"},
+ {"%dms", "%dms"},
{"Outbound tunnels", "Odchozí tunely"},
{"Tags", "Štítky"},
{"Incoming", "Příchozí"},
@@ -199,10 +199,10 @@ namespace czech // language namespace
static std::map> plurals
{
- {"days", {"den", "dny", "dní", "dní"}},
- {"hours", {"hodina", "hodiny", "hodin", "hodin"}},
- {"minutes", {"minuta", "minuty", "minut", "minut"}},
- {"seconds", {"vteřina", "vteřiny", "vteřin", "vteřin"}},
+ {"%d days", {"%d den", "%d dny", "%d dní", "%d dní"}},
+ {"%d hours", {"%d hodina", "%d hodiny", "%d hodin", "%d hodin"}},
+ {"%d minutes", {"%d minuta", "%d minuty", "%d minut", "%d minut"}},
+ {"%d seconds", {"%d vteřina", "%d vteřiny", "%d vteřin", "%d vteřin"}},
{"", {"", "", "", ""}},
};
diff --git a/i18n/French.cpp b/i18n/French.cpp
index 1a49ddfc..0d32c5c2 100644
--- a/i18n/French.cpp
+++ b/i18n/French.cpp
@@ -31,9 +31,9 @@ namespace french // language namespace
static std::map strings
{
- {"KiB", "Kio"},
- {"MiB", "Mio"},
- {"GiB", "Gio"},
+ {"%.2f KiB", "%.2f Kio"},
+ {"%.2f MiB", "%.2f Mio"},
+ {"%.2f GiB", "%.2f Gio"},
{"building", "En construction"},
{"failed", "échoué"},
{"expiring", "expiré"},
@@ -69,7 +69,7 @@ namespace french // language namespace
{"Family", "Famille"},
{"Tunnel creation success rate", "Taux de succès de création de tunnels"},
{"Received", "Reçu"},
- {"KiB/s", "kio/s"},
+ {"%.2f KiB/s", "%.2f kio/s"},
{"Sent", "Envoyé"},
{"Transit", "Transité"},
{"Data path", "Emplacement des données"},
@@ -93,7 +93,7 @@ namespace french // language namespace
{"Address", "Adresse"},
{"Type", "Type"},
{"Inbound tunnels", "Tunnels entrants"},
- {"ms", "ms"},
+ {"%dms", "%dms"},
{"Outbound tunnels", "Tunnels sortants"},
{"Tags", "Balises"},
{"Incoming", "Entrant"},
@@ -194,10 +194,10 @@ namespace french // language namespace
static std::map> plurals
{
- {"days", {"jour", "jours"}},
- {"hours", {"heure", "heures"}},
- {"minutes", {"minute", "minutes"}},
- {"seconds", {"seconde", "secondes"}},
+ {"%d days", {"%d jour", "%d jours"}},
+ {"%d hours", {"%d heure", "%d heures"}},
+ {"%d minutes", {"%d minute", "%d minutes"}},
+ {"%d seconds", {"%d seconde", "%d secondes"}},
{"", {"", ""}},
};
diff --git a/i18n/German.cpp b/i18n/German.cpp
index 489a93a7..ca669436 100644
--- a/i18n/German.cpp
+++ b/i18n/German.cpp
@@ -31,9 +31,9 @@ namespace german // language namespace
static std::map strings
{
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
+ {"%.2f KiB", "%.2f KiB"},
+ {"%.2f MiB", "%.2f MiB"},
+ {"%.2f GiB", "%.2f GiB"},
{"building", "In Bau"},
{"failed", "fehlgeschlagen"},
{"expiring", "läuft ab"},
@@ -69,7 +69,7 @@ namespace german // language namespace
{"Family", "Familie"},
{"Tunnel creation success rate", "Erfolgsrate der Tunnelerstellung"},
{"Received", "Eingegangen"},
- {"KiB/s", "KiB/s"},
+ {"%.2f KiB/s", "%.2f KiB/s"},
{"Sent", "Gesendet"},
{"Transit", "Transit"},
{"Data path", "Datenpfad"},
@@ -95,7 +95,7 @@ namespace german // language namespace
{"Type", "Typ"},
{"EncType", "Verschlüsselungstyp"},
{"Inbound tunnels", "Eingehende Tunnel"},
- {"ms", "ms"},
+ {"%dms", "%dms"},
{"Outbound tunnels", "Ausgehende Tunnel"},
{"Tags", "Tags"},
{"Incoming", "Eingehend"},
@@ -199,10 +199,10 @@ namespace german // language namespace
static std::map> plurals
{
- {"days", {"Tag", "Tage"}},
- {"hours", {"Stunde", "Stunden"}},
- {"minutes", {"Minute", "Minuten"}},
- {"seconds", {"Sekunde", "Sekunden"}},
+ {"%d days", {"%d Tag", "%d Tage"}},
+ {"%d hours", {"%d Stunde", "%d Stunden"}},
+ {"%d minutes", {"%d Minute", "%d Minuten"}},
+ {"%d seconds", {"%d Sekunde", "%d Sekunden"}},
{"", {"", ""}},
};
diff --git a/i18n/I18N.h b/i18n/I18N.h
index 27e043b9..2489ddcf 100644
--- a/i18n/I18N.h
+++ b/i18n/I18N.h
@@ -67,17 +67,71 @@ namespace i18n
const std::map> m_Plurals;
std::function m_Formula;
};
-
+
void SetLanguage(const std::string &lang);
std::string translate (const std::string& arg);
std::string translate (const std::string& arg, const std::string& arg2, const int& n);
} // i18n
} // i2p
-template
-std::string tr (TArgs&&... args)
+/**
+ * @brief Get translation of string
+ * @param arg String with message
+ */
+template
+std::string tr (TValue&& arg)
{
- return i2p::i18n::translate(std::forward(args)...);
+ return i2p::i18n::translate(std::forward(arg));
+}
+
+/**
+ * @brief Get translation of string and format it
+ * @param arg String with message
+ * @param args Array of arguments for string formatting
+*/
+template
+std::string tr (TValue&& arg, TArgs&&... args)
+{
+ std::string tr_str = i2p::i18n::translate(std::forward(arg));
+
+ size_t size = snprintf(NULL, 0, tr_str.c_str(), std::forward(args)...);
+ size = size + 1;
+ std::string str(size, 0);
+ snprintf(str.data(), size, tr_str.c_str(), std::forward(args)...);
+
+ return str;
+}
+
+/**
+ * @brief Get translation of string with plural forms
+ * @param arg String with message in singular form
+ * @param arg2 String with message in plural form
+ * @param n Integer, used for selection of form
+ */
+template
+std::string ntr (TValue&& arg, TValue2&& arg2, int& n)
+{
+ return i2p::i18n::translate(std::forward(arg), std::forward(arg2), std::forward(n));
+}
+
+/**
+ * @brief Get translation of string with plural forms and format it
+ * @param arg String with message in singular form
+ * @param arg2 String with message in plural form
+ * @param n Integer, used for selection of form
+ * @param args Array of arguments for string formatting
+ */
+template
+std::string ntr (TValue&& arg, TValue2&& arg2, int& n, TArgs&&... args)
+{
+ std::string tr_str = i2p::i18n::translate(std::forward(arg), std::forward(arg2), std::forward(n));
+
+ size_t size = snprintf(NULL, 0, tr_str.c_str(), std::forward(args)...);
+ size = size + 1;
+ std::string str(size, 0);
+ snprintf(str.data(), size, tr_str.c_str(), std::forward(args)...);
+
+ return str;
}
#endif // __I18N_H__
diff --git a/i18n/Italian.cpp b/i18n/Italian.cpp
index ef2e26d0..07e436d7 100644
--- a/i18n/Italian.cpp
+++ b/i18n/Italian.cpp
@@ -31,9 +31,9 @@ namespace italian // language namespace
static std::map strings
{
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
+ {"%.2f KiB", "%.2f KiB"},
+ {"%.2f MiB", "%.2f MiB"},
+ {"%.2f GiB", "%.2f GiB"},
{"building", "in costruzione"},
{"failed", "fallito"},
{"expiring", "in scadenza"},
@@ -69,7 +69,7 @@ namespace italian // language namespace
{"Family", "Famiglia"},
{"Tunnel creation success rate", "Percentuale di tunnel creati con successo"},
{"Received", "Ricevuti"},
- {"KiB/s", "KiB/s"},
+ {"%.2f KiB/s", "%.2f KiB/s"},
{"Sent", "Inviati"},
{"Transit", "Transitati"},
{"Data path", "Percorso dati"},
@@ -95,7 +95,7 @@ namespace italian // language namespace
{"Type", "Tipologia"},
{"EncType", "Tipo di crittografia"},
{"Inbound tunnels", "Tunnel in entrata"},
- {"ms", "ms"},
+ {"%dms", "%dms"},
{"Outbound tunnels", "Tunnel in uscita"},
{"Tags", "Tag"},
{"Incoming", "In entrata"},
@@ -199,10 +199,10 @@ namespace italian // language namespace
static std::map> plurals
{
- {"days", {"giorno", "giorni"}},
- {"hours", {"ora", "ore"}},
- {"minutes", {"minuto", "minuti"}},
- {"seconds", {"secondo", "secondi"}},
+ {"%d days", {"%d giorno", "%d giorni"}},
+ {"%d hours", {"%d ora", "%d ore"}},
+ {"%d minutes", {"%d minuto", "%d minuti"}},
+ {"%d seconds", {"%d secondo", "%d secondi"}},
{"", {"", ""}},
};
diff --git a/i18n/Russian.cpp b/i18n/Russian.cpp
index d7616e9e..7d875f01 100644
--- a/i18n/Russian.cpp
+++ b/i18n/Russian.cpp
@@ -31,9 +31,9 @@ namespace russian // language namespace
static std::map strings
{
- {"KiB", "КиБ"},
- {"MiB", "МиБ"},
- {"GiB", "ГиБ"},
+ {"%.2f KiB", "%.2f КиБ"},
+ {"%.2f MiB", "%.2f МиБ"},
+ {"%.2f GiB", "%.2f ГиБ"},
{"building", "строится"},
{"failed", "неудачный"},
{"expiring", "истекает"},
@@ -68,7 +68,7 @@ namespace russian // language namespace
{"Family", "Семейство"},
{"Tunnel creation success rate", "Успешно построенных туннелей"},
{"Received", "Получено"},
- {"KiB/s", "КиБ/с"},
+ {"%.2f KiB/s", "%.2f КиБ/с"},
{"Sent", "Отправлено"},
{"Transit", "Транзит"},
{"Data path", "Путь к данным"},
@@ -94,7 +94,7 @@ namespace russian // language namespace
{"Type", "Тип"},
{"EncType", "ТипШифр"},
{"Inbound tunnels", "Входящие туннели"},
- {"ms", "мс"},
+ {"%dms", "%dмс"},
{"Outbound tunnels", "Исходящие туннели"},
{"Tags", "Теги"},
{"Incoming", "Входящие"},
@@ -198,10 +198,10 @@ namespace russian // language namespace
static std::map> plurals
{
- {"days", {"день", "дня", "дней"}},
- {"hours", {"час", "часа", "часов"}},
- {"minutes", {"минуту", "минуты", "минут"}},
- {"seconds", {"секунду", "секунды", "секунд"}},
+ {"%d days", {"%d день", "%d дня", "%d дней"}},
+ {"%d hours", {"%d час", "%d часа", "%d часов"}},
+ {"%d minutes", {"%d минуту", "%d минуты", "%d минут"}},
+ {"%d seconds", {"%d секунду", "%d секунды", "%d секунд"}},
{"", {"", "", ""}},
};
diff --git a/i18n/Spanish.cpp b/i18n/Spanish.cpp
index a2f53927..8b0e927a 100644
--- a/i18n/Spanish.cpp
+++ b/i18n/Spanish.cpp
@@ -31,9 +31,9 @@ namespace spanish // language namespace
static std::map strings
{
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
+ {"%.2f KiB", "%.2f KiB"},
+ {"%.2f MiB", "%.2f MiB"},
+ {"%.2f GiB", "%.2f GiB"},
{"building", "pendiente"},
{"failed", "fallido"},
{"expiring", "expiró"},
@@ -69,7 +69,7 @@ namespace spanish // language namespace
{"Family", "Familia"},
{"Tunnel creation success rate", "Tasa de éxito de creación de túneles"},
{"Received", "Recibido"},
- {"KiB/s", "KiB/s"},
+ {"%.2f KiB/s", "%.2f KiB/s"},
{"Sent", "Enviado"},
{"Transit", "Tránsito"},
{"Data path", "Ruta de datos"},
@@ -95,7 +95,7 @@ namespace spanish // language namespace
{"Type", "Tipo"},
{"EncType", "TipoEncrip"},
{"Inbound tunnels", "Túneles entrantes"},
- {"ms", "ms"},
+ {"%dms", "%dms"},
{"Outbound tunnels", "Túneles salientes"},
{"Tags", "Etiquetas"},
{"Incoming", "Entrante"},
@@ -199,10 +199,10 @@ namespace spanish // language namespace
static std::map> plurals
{
- {"days", {"día", "días"}},
- {"hours", {"hora", "horas"}},
- {"minutes", {"minuto", "minutos"}},
- {"seconds", {"segundo", "segundos"}},
+ {"%d days", {"%d día", "%d días"}},
+ {"%d hours", {"%d hora", "%d horas"}},
+ {"%d minutes", {"%d minuto", "%d minutos"}},
+ {"%d seconds", {"%d segundo", "%d segundos"}},
{"", {"", ""}},
};
diff --git a/i18n/Turkmen.cpp b/i18n/Turkmen.cpp
index 356ada85..7e7a24f0 100644
--- a/i18n/Turkmen.cpp
+++ b/i18n/Turkmen.cpp
@@ -31,9 +31,9 @@ namespace turkmen // language namespace
static std::map strings
{
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
+ {"%.2f KiB", "%.2f KiB"},
+ {"%.2f MiB", "%.2f MiB"},
+ {"%.2f GiB", "%.2f GiB"},
{"building", "bina"},
{"failed", "şowsuz"},
{"expiring", "möhleti gutarýar"},
@@ -68,7 +68,7 @@ namespace turkmen // language namespace
{"Family", "Maşgala"},
{"Tunnel creation success rate", "Gurlan teneller üstünlikli gurlan teneller"},
{"Received", "Alnan"},
- {"KiB/s", "KiB/s"},
+ {"%.2f KiB/s", "%.2f KiB/s"},
{"Sent", "Ýerleşdirildi"},
{"Transit", "Tranzit"},
{"Data path", "Maglumat ýoly"},
@@ -94,7 +94,7 @@ namespace turkmen // language namespace
{"Type", "Görnüş"},
{"EncType", "Şifrlemek görnüşi"},
{"Inbound tunnels", "Gelýän tuneller"},
- {"ms", "ms"},
+ {"%dms", "%dms"},
{"Outbound tunnels", "Çykýan tuneller"},
{"Tags", "Bellikler"},
{"Incoming", "Gelýän"},
@@ -198,10 +198,10 @@ namespace turkmen // language namespace
static std::map> plurals
{
- {"days", {"gün", "gün"}},
- {"hours", {"sagat", "sagat"}},
- {"minutes", {"minut", "minut"}},
- {"seconds", {"sekunt", "sekunt"}},
+ {"%d days", {"%d gün", "%d gün"}},
+ {"%d hours", {"%d sagat", "%d sagat"}},
+ {"%d minutes", {"%d minut", "%d minut"}},
+ {"%d seconds", {"%d sekunt", "%d sekunt"}},
{"", {"", ""}},
};
diff --git a/i18n/Ukrainian.cpp b/i18n/Ukrainian.cpp
index abbe8f81..991f46ab 100644
--- a/i18n/Ukrainian.cpp
+++ b/i18n/Ukrainian.cpp
@@ -31,9 +31,9 @@ namespace ukrainian // language namespace
static std::map strings
{
- {"KiB", "КіБ"},
- {"MiB", "МіБ"},
- {"GiB", "ГіБ"},
+ {"%.2f KiB", "%.2f КіБ"},
+ {"%.2f MiB", "%.2f МіБ"},
+ {"%.2f GiB", "%.2f ГіБ"},
{"building", "будується"},
{"failed", "невдалий"},
{"expiring", "завершується"},
@@ -68,7 +68,7 @@ namespace ukrainian // language namespace
{"Family", "Сімейство"},
{"Tunnel creation success rate", "Успішно побудованих тунелів"},
{"Received", "Отримано"},
- {"KiB/s", "КіБ/с"},
+ {"%.2f KiB/s", "%.2f КіБ/с"},
{"Sent", "Відправлено"},
{"Transit", "Транзит"},
{"Data path", "Шлях до даних"},
@@ -94,7 +94,7 @@ namespace ukrainian // language namespace
{"Type", "Тип"},
{"EncType", "ТипШифр"},
{"Inbound tunnels", "Вхідні тунелі"},
- {"ms", "мс"},
+ {"%dms", "%dмс"},
{"Outbound tunnels", "Вихідні тунелі"},
{"Tags", "Теги"},
{"Incoming", "Вхідні"},
@@ -198,10 +198,10 @@ namespace ukrainian // language namespace
static std::map> plurals
{
- {"days", {"день", "дня", "днів"}},
- {"hours", {"годину", "години", "годин"}},
- {"minutes", {"хвилину", "хвилини", "хвилин"}},
- {"seconds", {"секунду", "секунди", "секунд"}},
+ {"%d days", {"%d день", "%d дня", "%d днів"}},
+ {"%d hours", {"%d годину", "%d години", "%d годин"}},
+ {"%d minutes", {"%d хвилину", "%d хвилини", "%d хвилин"}},
+ {"%d seconds", {"%d секунду", "%d секунди", "%d секунд"}},
{"", {"", "", ""}},
};
diff --git a/i18n/Uzbek.cpp b/i18n/Uzbek.cpp
index e750918f..7355471b 100644
--- a/i18n/Uzbek.cpp
+++ b/i18n/Uzbek.cpp
@@ -31,9 +31,9 @@ namespace uzbek // language namespace
static std::map strings
{
- {"KiB", "KiB"},
- {"MiB", "MiB"},
- {"GiB", "GiB"},
+ {"%.2f KiB", "%.2f KiB"},
+ {"%.2f MiB", "%.2f MiB"},
+ {"%.2f GiB", "%.2f GiB"},
{"building", "yaratilmoqda"},
{"failed", "muvaffaqiyatsiz"},
{"expiring", "muddati tugaydi"},
@@ -68,7 +68,7 @@ namespace uzbek // language namespace
{"Family", "Oila"},
{"Tunnel creation success rate", "Tunnel yaratish muvaffaqiyat darajasi"},
{"Received", "Qabul qilindi"},
- {"KiB/s", "KiB/s"},
+ {"%.2f KiB/s", "%.2f KiB/s"},
{"Sent", "Yuborilgan"},
{"Transit", "Tranzit"},
{"Data path", "Ma'lumotlar joylanishi"},
@@ -94,7 +94,7 @@ namespace uzbek // language namespace
{"Type", "Turi"},
{"EncType", "ShifrlashTuri"},
{"Inbound tunnels", "Kirish tunnellari"},
- {"ms", "ms"},
+ {"%dms", "%dms"},
{"Outbound tunnels", "Chiquvchi tunnellar"},
{"Tags", "Teglar"},
{"Incoming", "Kiruvchi"},
@@ -198,10 +198,10 @@ namespace uzbek // language namespace
static std::map> plurals
{
- {"days", {"kun", "kun"}},
- {"hours", {"soat", "soat"}},
- {"minutes", {"daqiqa", "daqiqa"}},
- {"seconds", {"soniya", "soniya"}},
+ {"%d days", {"%d kun", "%d kun"}},
+ {"%d hours", {"%d soat", "%d soat"}},
+ {"%d minutes", {"%d daqiqa", "%d daqiqa"}},
+ {"%d seconds", {"%d soniya", "%d soniya"}},
{"", {"", ""}},
};