kotatogram-desktop/Telegram/SourceFiles/kotato/kotato_lang.h
RadRussianRus 1cc8bb07ee [Core] Language system
Telegram Desktop uses static language system with code generation, which
requires almost full app rebuild on any string modification, no matter
how small it is.

Since Kotatogram is options-driven, static language system will slow the
development. This language system solves the problem by using JSON and
runtime string search instead.
2024-12-09 21:16:01 +03:00

166 lines
4.7 KiB
C++

/*
This file is part of Kotatogram Desktop,
the unofficial app based on Telegram Desktop.
For license and copyright information please follow this link:
https://github.com/kotatogram/kotatogram-desktop/blob/dev/LEGAL
*/
#pragma once
namespace Kotato {
namespace Lang {
struct Var {
Var() {};
Var(const QString &k, const QString &v) {
key = k;
value = v;
}
QString key;
QString value;
};
struct EntVar {
EntVar() {};
EntVar(const QString &k, TextWithEntities v) {
key = k;
value = v;
}
QString key;
TextWithEntities value;
};
void Load(const QString &baseLangCode, const QString &langCode);
QString Translate(
const QString &key,
Var var1 = Var(),
Var var2 = Var(),
Var var3 = Var(),
Var var4 = Var());
QString Translate(
const QString &key,
float64 value,
Var var1 = Var(),
Var var2 = Var(),
Var var3 = Var(),
Var var4 = Var());
TextWithEntities TranslateWithEntities(
const QString &key,
EntVar var1 = EntVar(),
EntVar var2 = EntVar(),
EntVar var3 = EntVar(),
EntVar var4 = EntVar());
TextWithEntities TranslateWithEntities(
const QString &key,
float64 value,
EntVar var1 = EntVar(),
EntVar var2 = EntVar(),
EntVar var3 = EntVar(),
EntVar var4 = EntVar());
rpl::producer<> Events();
} // namespace Lang
} // namespace Kotato
// Shorthands
inline QString ktr(
const QString &key,
::Kotato::Lang::Var var1 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var2 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var3 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var4 = ::Kotato::Lang::Var()) {
return ::Kotato::Lang::Translate(key, var1, var2, var3, var4);
}
inline QString ktr(
const QString &key,
float64 value,
::Kotato::Lang::Var var1 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var2 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var3 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var4 = ::Kotato::Lang::Var()) {
return ::Kotato::Lang::Translate(key, value, var1, var2, var3, var4);
}
inline TextWithEntities ktre(
const QString &key,
::Kotato::Lang::EntVar var1 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var2 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var3 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var4 = ::Kotato::Lang::EntVar()) {
return ::Kotato::Lang::TranslateWithEntities(key, var1, var2, var3, var4);
}
inline TextWithEntities ktre(
const QString &key,
float64 value,
::Kotato::Lang::EntVar var1 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var2 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var3 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var4 = ::Kotato::Lang::EntVar()) {
return ::Kotato::Lang::TranslateWithEntities(key, value, var1, var2, var3, var4);
}
inline rpl::producer<QString> rktr(
const QString &key,
::Kotato::Lang::Var var1 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var2 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var3 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var4 = ::Kotato::Lang::Var()) {
return rpl::single(
::Kotato::Lang::Translate(key, var1, var2, var3, var4)
) | rpl::then(
::Kotato::Lang::Events() | rpl::map(
[=]{ return ::Kotato::Lang::Translate(key, var1, var2, var3, var4); })
);
}
inline rpl::producer<QString> rktr(
const QString &key,
float64 value,
::Kotato::Lang::Var var1 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var2 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var3 = ::Kotato::Lang::Var(),
::Kotato::Lang::Var var4 = ::Kotato::Lang::Var()) {
return rpl::single(
::Kotato::Lang::Translate(key, value, var1, var2, var3, var4)
) | rpl::then(
::Kotato::Lang::Events() | rpl::map(
[=]{ return ::Kotato::Lang::Translate(key, value, var1, var2, var3, var4); })
);
}
inline rpl::producer<TextWithEntities> rktre(
const QString &key,
::Kotato::Lang::EntVar var1 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var2 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var3 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var4 = ::Kotato::Lang::EntVar()) {
return rpl::single(
::Kotato::Lang::TranslateWithEntities(key, var1, var2, var3, var4)
) | rpl::then(
::Kotato::Lang::Events() | rpl::map(
[=]{ return ::Kotato::Lang::TranslateWithEntities(key, var1, var2, var3, var4); })
);
}
inline rpl::producer<TextWithEntities> rktre(
const QString &key,
float64 value,
::Kotato::Lang::EntVar var1 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var2 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var3 = ::Kotato::Lang::EntVar(),
::Kotato::Lang::EntVar var4 = ::Kotato::Lang::EntVar()) {
return rpl::single(
::Kotato::Lang::TranslateWithEntities(key, value, var1, var2, var3, var4)
) | rpl::then(
::Kotato::Lang::Events() | rpl::map(
[=]{ return ::Kotato::Lang::TranslateWithEntities(key, value, var1, var2, var3, var4); })
);
}