translation of all project, and new translation mechanism

This commit is contained in:
2026-09-03 09:18:48 +03:00
parent 00e7c957e4
commit 01af372ef2
32 changed files with 2813 additions and 537 deletions
+31 -35
View File
@@ -1,4 +1,5 @@
#include "msaauthservice.h"
#include "localization.h"
#include <QDateTime>
#include <QJsonArray>
@@ -64,21 +65,19 @@ QString describeXstsError(const QJsonObject &response)
const qint64 code = static_cast<qint64>(response.value(QStringLiteral("XErr")).toDouble());
switch (code) {
case 2148916233:
return MsaAuthService::tr("К аккаунту Microsoft не привязан профиль Xbox. "
"Создайте его на xbox.com и повторите вход.");
return Loc::text("auth.msa.error.noXboxProfile");
case 2148916235:
return MsaAuthService::tr("Xbox Live недоступен в стране, указанной в аккаунте");
return Loc::text("auth.msa.error.countryBlocked");
case 2148916236:
case 2148916237:
return MsaAuthService::tr("Аккаунту нужна проверка возраста на xbox.com");
return Loc::text("auth.msa.error.ageVerification");
case 2148916238:
return MsaAuthService::tr("Детский аккаунт: добавьте его в семейную группу "
"Microsoft, иначе вход в Xbox Live невозможен");
return Loc::text("auth.msa.error.childAccount");
default:
break;
}
const QString message = response.value(QStringLiteral("Message")).toString();
return message.isEmpty() ? MsaAuthService::tr("Xbox Live отклонил вход (XErr %1)").arg(code)
return message.isEmpty() ? Loc::text("auth.msa.error.xboxRejected").arg(code)
: message;
}
@@ -90,7 +89,7 @@ QString describeOauthError(const QJsonObject &response, int status)
const QString error = response.value(QStringLiteral("error")).toString();
if (!error.isEmpty())
return error;
return MsaAuthService::tr("Microsoft вернул код %1").arg(status);
return Loc::text("auth.msa.error.microsoftCode").arg(status);
}
} // namespace
@@ -216,7 +215,7 @@ void MsaAuthService::loginWithCode(const QString &code, Callback callback)
{
if (code.isEmpty()) {
AuthResult result;
result.error = tr("Microsoft не вернул код авторизации");
result.error = Loc::text("auth.msa.error.noAuthCode");
callback(result);
return;
}
@@ -227,7 +226,7 @@ void MsaAuthService::loginWithCode(const QString &code, Callback callback)
form.addQueryItem(QStringLiteral("grant_type"), QStringLiteral("authorization_code"));
form.addQueryItem(QStringLiteral("redirect_uri"), kRedirectUri);
emit progress(tr("Обмен кода Microsoft на токен…"));
emit progress(Loc::text("auth.msa.progress.exchangingCode"));
exchangeToken(form.toString(QUrl::FullyEncoded).toUtf8(), std::move(callback));
}
@@ -235,7 +234,7 @@ void MsaAuthService::loginWithRefreshToken(const QString &refreshToken, Callback
{
if (refreshToken.isEmpty()) {
AuthResult result;
result.error = tr("Профиль не подключён к аккаунту Microsoft");
result.error = Loc::text("auth.msa.error.profileNotLinked");
callback(result);
return;
}
@@ -247,7 +246,7 @@ void MsaAuthService::loginWithRefreshToken(const QString &refreshToken, Callback
form.addQueryItem(QStringLiteral("redirect_uri"), kRedirectUri);
form.addQueryItem(QStringLiteral("scope"), kScope);
emit progress(tr("Обновление сессии Microsoft…"));
emit progress(Loc::text("auth.msa.progress.refreshingSession"));
exchangeToken(form.toString(QUrl::FullyEncoded).toUtf8(), std::move(callback));
}
@@ -257,7 +256,7 @@ void MsaAuthService::exchangeToken(const QByteArray &form, Callback callback)
[this, callback](int status, const QJsonObject &response, const QString &transportError) {
if (!transportError.isEmpty()) {
AuthResult result;
result.error = tr("Нет связи с сервером Microsoft: %1").arg(transportError);
result.error = Loc::text("auth.msa.error.microsoftUnreachable").arg(transportError);
callback(result);
return;
}
@@ -274,7 +273,7 @@ void MsaAuthService::exchangeToken(const QByteArray &form, Callback callback)
const QString refreshToken = response.value(QStringLiteral("refresh_token")).toString();
if (accessToken.isEmpty()) {
AuthResult result;
result.error = tr("Microsoft не вернул токен доступа");
result.error = Loc::text("auth.msa.error.noAccessToken");
callback(result);
return;
}
@@ -286,7 +285,7 @@ void MsaAuthService::authenticateXbox(const QString &microsoftToken,
const QString &refreshToken,
Callback callback)
{
emit progress(tr("Вход в Xbox Live…"));
emit progress(Loc::text("auth.msa.progress.xboxSignIn"));
QJsonObject properties{{QStringLiteral("AuthMethod"), QStringLiteral("RPS")},
{QStringLiteral("SiteName"), QStringLiteral("user.auth.xboxlive.com")},
@@ -300,19 +299,19 @@ void MsaAuthService::authenticateXbox(const QString &microsoftToken,
const QString &transportError) {
AuthResult result;
if (!transportError.isEmpty()) {
result.error = tr("Нет связи с Xbox Live: %1").arg(transportError);
result.error = Loc::text("auth.msa.error.xboxUnreachable").arg(transportError);
callback(result);
return;
}
if (status != 200) {
result.error = tr("Xbox Live отклонил токен Microsoft (код %1)").arg(status);
result.error = Loc::text("auth.msa.error.xboxTokenRejected").arg(status);
callback(result);
return;
}
const QString token = response.value(QStringLiteral("Token")).toString();
if (token.isEmpty()) {
result.error = tr("Xbox Live не вернул токен");
result.error = Loc::text("auth.msa.error.xboxNoToken");
callback(result);
return;
}
@@ -324,7 +323,7 @@ void MsaAuthService::authorizeXsts(const QString &xblToken,
const QString &refreshToken,
Callback callback)
{
emit progress(tr("Проверка прав XSTS…"));
emit progress(Loc::text("auth.msa.progress.xsts"));
const QJsonObject properties{{QStringLiteral("SandboxId"), QStringLiteral("RETAIL")},
{QStringLiteral("UserTokens"), QJsonArray{xblToken}}};
@@ -338,7 +337,7 @@ void MsaAuthService::authorizeXsts(const QString &xblToken,
const QString &transportError) {
AuthResult result;
if (!transportError.isEmpty()) {
result.error = tr("Нет связи с сервером XSTS: %1").arg(transportError);
result.error = Loc::text("auth.msa.error.xstsUnreachable").arg(transportError);
callback(result);
return;
}
@@ -348,7 +347,7 @@ void MsaAuthService::authorizeXsts(const QString &xblToken,
return;
}
if (status != 200) {
result.error = tr("XSTS отклонил запрос (код %1)").arg(status);
result.error = Loc::text("auth.msa.error.xstsRejected").arg(status);
callback(result);
return;
}
@@ -357,7 +356,7 @@ void MsaAuthService::authorizeXsts(const QString &xblToken,
const QJsonObject claim = displayClaim(response);
const QString userHash = claim.value(QStringLiteral("uhs")).toString();
if (token.isEmpty() || userHash.isEmpty()) {
result.error = tr("XSTS не вернул данные пользователя");
result.error = Loc::text("auth.msa.error.xstsNoUser");
callback(result);
return;
}
@@ -372,7 +371,7 @@ void MsaAuthService::loginWithXbox(const QString &userHash,
const QString &refreshToken,
Callback callback)
{
emit progress(tr("Авторизация в Minecraft Services…"));
emit progress(Loc::text("auth.msa.progress.minecraftServices"));
const QJsonObject body{{QStringLiteral("identityToken"),
QStringLiteral("XBL3.0 x=%1;%2").arg(userHash, xstsToken)}};
@@ -382,19 +381,19 @@ void MsaAuthService::loginWithXbox(const QString &userHash,
const QString &transportError) {
AuthResult result;
if (!transportError.isEmpty()) {
result.error = tr("Нет связи с api.minecraftservices.com: %1").arg(transportError);
result.error = Loc::text("auth.msa.error.servicesUnreachable").arg(transportError);
callback(result);
return;
}
if (status != 200) {
result.error = tr("Minecraft Services отклонили вход (код %1)").arg(status);
result.error = Loc::text("auth.msa.error.servicesRejected").arg(status);
callback(result);
return;
}
result.accessToken = response.value(QStringLiteral("access_token")).toString();
if (result.accessToken.isEmpty()) {
result.error = tr("Minecraft Services не вернули токен доступа");
result.error = Loc::text("auth.msa.error.servicesNoToken");
callback(result);
return;
}
@@ -411,7 +410,7 @@ void MsaAuthService::loginWithXbox(const QString &userHash,
void MsaAuthService::checkLicense(AuthResult result, Callback callback)
{
emit progress(tr("Проверка лицензии Minecraft…"));
emit progress(Loc::text("auth.msa.progress.checkingLicence"));
getJson(QUrl(kEntitlementsUrl), result.accessToken,
[this, result, callback](int status, const QJsonObject &response, const QString &) {
@@ -430,7 +429,7 @@ void MsaAuthService::fetchProfile(AuthResult result, bool storeEntitlement, Call
[result, storeEntitlement, callback](int status, const QJsonObject &response,
const QString &transportError) mutable {
if (!transportError.isEmpty()) {
result.error = MsaAuthService::tr("Нет связи с api.minecraftservices.com: %1")
result.error = Loc::text("auth.msa.error.servicesUnreachable")
.arg(transportError);
callback(result);
return;
@@ -442,17 +441,14 @@ void MsaAuthService::fetchProfile(AuthResult result, bool storeEntitlement, Call
result.licenseMissing = true;
result.error =
storeEntitlement
? MsaAuthService::tr("На аккаунте Microsoft есть покупка, но игровой "
"профиль не создан. Зайдите один раз в "
"официальный лаунчер и выберите ник.")
: MsaAuthService::tr("На этом аккаунте Microsoft нет копии "
"Minecraft: Java Edition");
? Loc::text("auth.msa.error.noProfileYet")
: Loc::text("auth.msa.error.noLicence");
callback(result);
return;
}
if (status != 200) {
result.error =
MsaAuthService::tr("Не удалось получить профиль Minecraft (код %1)").arg(status);
Loc::text("auth.msa.error.profileFetchFailed").arg(status);
callback(result);
return;
}
@@ -462,7 +458,7 @@ void MsaAuthService::fetchProfile(AuthResult result, bool storeEntitlement, Call
result.ok = !result.playerName.isEmpty() && !result.uuid.isEmpty();
if (!result.ok) {
result.licenseMissing = true;
result.error = MsaAuthService::tr("Minecraft Services не вернули игровой профиль");
result.error = Loc::text("auth.msa.error.servicesNoProfile");
}
callback(result);
});