first release of translation facility

* runtime - loading and translating
 * design-time - works with *.ts file (pip_tr utility)
 * compile-time - CMake macro for compile *.ts
This commit is contained in:
2024-11-05 13:49:00 +03:00
parent 73ed51e3d4
commit 57f8c1313e
52 changed files with 1571 additions and 480 deletions

View File

@@ -297,7 +297,7 @@ llong PIString::toNumberBase(const PIString & value, int base, bool * ok) {
void PIString::appendFromChars(const char * c, int s, const char * codepage) {
// piCout << "appendFromChars";
// piCout << "appendFromChars";
if (s == 0) return;
int old_sz = size_s();
if (s == -1) s = strlen(c);
@@ -523,6 +523,31 @@ void PIString::trimsubstr(int & st, int & fn) const {
}
PIString PIString::minArgPlaceholder() {
if (size() < 2) return {};
int min = -1;
PIString ret, tmp;
for (int i = 0; i < size_s(); ++i) {
if (at(i) == '%') {
int j = 0;
for (j = i + 1; j < size_s(); ++j) {
if (!at(j).isDigit()) break;
}
bool ok = false;
tmp = mid(i + 1, j - i - 1);
int cur = tmp.toInt(10, &ok);
if (!ok) continue;
if (min < 0 || min > cur) {
min = cur;
ret = tmp;
}
}
}
if (ret.isEmpty()) return {};
return "%" + ret;
}
uint PIString::hash() const {
return piHashData((const uchar *)d.data(), d.size() * sizeof(PIChar));
}
@@ -1744,10 +1769,9 @@ ldouble PIString::toLDouble() const {
//! piCout << s; // 47.6 GiB
//! \endcode
PIString & PIString::setReadableSize(llong bytes) {
static const PIString tr_c = "PIString"_a;
clear();
if (bytes < 1024) {
*this += (PIString::fromNumber(bytes) + " "_a + PITranslator::tr("B", tr_c));
*this += (PIString::fromNumber(bytes) + " "_a + "B"_tr("PIString"));
return *this;
}
double fres = bytes;
@@ -1762,14 +1786,21 @@ PIString & PIString::setReadableSize(llong bytes) {
}
return false;
};
if (checkRange(PITranslator::tr("KiB", tr_c))) return *this;
if (checkRange(PITranslator::tr("MiB", tr_c))) return *this;
if (checkRange(PITranslator::tr("GiB", tr_c))) return *this;
if (checkRange(PITranslator::tr("TiB", tr_c))) return *this;
if (checkRange(PITranslator::tr("PiB", tr_c))) return *this;
if (checkRange(PITranslator::tr("EiB", tr_c))) return *this;
if (checkRange(PITranslator::tr("ZiB", tr_c))) return *this;
checkRange(PITranslator::tr("YiB", tr_c), true);
if (checkRange("KiB"_tr("PIString"))) return *this;
if (checkRange("MiB"_tr("PIString"))) return *this;
if (checkRange("GiB"_tr("PIString"))) return *this;
if (checkRange("TiB"_tr("PIString"))) return *this;
if (checkRange("PiB"_tr("PIString"))) return *this;
if (checkRange("EiB"_tr("PIString"))) return *this;
if (checkRange("ZiB"_tr("PIString"))) return *this;
checkRange("YiB"_tr("PIString"), true);
return *this;
}
PIString & PIString::arg(const PIString & v) {
auto ph = minArgPlaceholder();
if (!ph.isEmpty()) replaceAll(ph, v);
return *this;
}