From f72d6d19e902f2d33814889443cfb34c93b68c87 Mon Sep 17 00:00:00 2001
From: HugeFrog24 <62775760+HugeFrog24@users.noreply.github.com>
Date: Wed, 8 Apr 2026 18:07:29 +0200
Subject: [PATCH 1/2] Fix duplicate mod checkboxes when process survives
between launches
Clear the userLibs vector in settle() before mods are re-registered,
preventing stale entries from accumulating across game launches.
---
app/src/main/cpp/main.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp
index 9ec482d..f6bf7e0 100644
--- a/app/src/main/cpp/main.cpp
+++ b/app/src/main/cpp/main.cpp
@@ -212,6 +212,7 @@ Java_git_artdeell_skymodloader_MainActivity_settle(
jboolean _hideCanvasMenu
) {
fsel_setup(env);
+ Canvas::userLibs.clear();
Canvas::MainActivity = clazz;
Canvas::CeserverEnabled = _ceserver_enabled;
Canvas::hideCanvasMenu = _hideCanvasMenu;
From bd6ec7d8b8232bdeff56ea8c4d9447124242f7a7 Mon Sep 17 00:00:00 2001
From: HugeFrog24 <62775760+HugeFrog24@users.noreply.github.com>
Date: Wed, 8 Apr 2026 18:07:55 +0200
Subject: [PATCH 2/2] Add i18n support with Russian and German translations
- Migrate hardcoded strings from layouts and Java code to string resources
- Mark non-translatable strings (paths, format strings, brand names)
- Add Russian (values-ru) and German (values-de) translations
- Add locales_config.xml for per-app language switching on Android 13+
- Fix typos: "Annulla" -> "Cancel", "NATRUAL" -> "NATURAL"
---
app/src/main/AndroidManifest.xml | 1 +
.../skymodloader/AboutDialogHelper.java | 24 ++--
.../artdeell/skymodloader/MainActivity.java | 2 +-
.../skymodloader/SettingsActivity.java | 14 +-
.../elfmod/ModManagerActivity.java | 6 +-
app/src/main/res/layout/about_dialog.xml | 4 +-
app/src/main/res/layout/dialog_clear_data.xml | 22 +--
.../res/layout/dialog_custom_bootloader.xml | 12 +-
app/src/main/res/layout/dialog_x.xml | 10 +-
app/src/main/res/layout/mod_manager.xml | 6 +-
app/src/main/res/layout/setting_layout.xml | 28 ++--
app/src/main/res/values-de/strings.xml | 136 ++++++++++++++++++
app/src/main/res/values-ru/strings.xml | 136 ++++++++++++++++++
app/src/main/res/values/strings.xml | 99 +++++++++++--
app/src/main/res/xml/locales_config.xml | 6 +
15 files changed, 432 insertions(+), 74 deletions(-)
create mode 100644 app/src/main/res/values-de/strings.xml
create mode 100644 app/src/main/res/values-ru/strings.xml
create mode 100644 app/src/main/res/xml/locales_config.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 279bf09..73ab45f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,6 +21,7 @@
android:allowBackup="true"
android:allowNativeHeapPointerTagging="false"
android:dataExtractionRules="@xml/data_extraction_rules"
+ android:localeConfig="@xml/locales_config"
android:extractNativeLibs="true"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/icon"
diff --git a/app/src/main/java/git/artdeell/skymodloader/AboutDialogHelper.java b/app/src/main/java/git/artdeell/skymodloader/AboutDialogHelper.java
index 73e4e5b..dfd174f 100644
--- a/app/src/main/java/git/artdeell/skymodloader/AboutDialogHelper.java
+++ b/app/src/main/java/git/artdeell/skymodloader/AboutDialogHelper.java
@@ -31,16 +31,16 @@ public static void show(Activity activity) {
LinearLayout timeline = dialog.findViewById(R.id.about_timeline);
- addChapter(activity, timeline, "The Origin", "Built from scratch by two developers who love Sky.", true);
- addPerson(activity, timeline, "artdeell", "Author", "artdeell", "https://github.com/artdeell");
- addPerson(activity, timeline, "lukas0x1", "Author · retired", "lukas0x1", "https://github.com/lukas0x1");
+ addChapter(activity, timeline, activity.getString(R.string.about_chapter_origin), activity.getString(R.string.about_chapter_origin_sub), true);
+ addPerson(activity, timeline, "artdeell", activity.getString(R.string.role_author), "artdeell", "https://github.com/artdeell");
+ addPerson(activity, timeline, "lukas0x1", activity.getString(R.string.role_author_retired), "lukas0x1", "https://github.com/lukas0x1");
endChapter(timeline);
- addChapter(activity, timeline, "The Present", "Currently keeping Canvas alive.", true);
- addPerson(activity, timeline, "MisterGatto", "Maintainer", "MisterGatto", "https://github.com/MisterGatto");
+ addChapter(activity, timeline, activity.getString(R.string.about_chapter_present), activity.getString(R.string.about_chapter_present_sub), true);
+ addPerson(activity, timeline, "MisterGatto", activity.getString(R.string.role_maintainer), "MisterGatto", "https://github.com/MisterGatto");
endChapter(timeline);
- addChapter(activity, timeline, "The Team", "Everyone who made Canvas better.", true);
+ addChapter(activity, timeline, activity.getString(R.string.about_chapter_team), activity.getString(R.string.about_chapter_team_sub), true);
addPerson(activity, timeline, "RomanChamelo", null, "RomanChamelo", "https://github.com/RomanChamelo");
addPerson(activity, timeline, "Kiojeen", null, "Kiojeen", "https://github.com/Kiojeen");
addPerson(activity, timeline, "Gxosty", null, "Gxosty", "https://github.com/gxosty");
@@ -51,15 +51,15 @@ public static void show(Activity activity) {
addPerson(activity, timeline, "alvindimas05", null, "alvindimas05", "https://github.com/alvindimas05");
endChapter(timeline);
- addChapter(activity, timeline, "The Art", "The faces behind the visuals.", true);
- addPersonCustomLink(activity, timeline, "Сон~", "Banner artwork", "VK ›", "https://vk.com/son583");
- addPersonCustomLink(activity, timeline, "Dysis", "App icon", "TG ›", "https://t.me/Eliatshaha");
+ addChapter(activity, timeline, activity.getString(R.string.about_chapter_art), activity.getString(R.string.about_chapter_art_sub), true);
+ addPersonCustomLink(activity, timeline, "Сон~", activity.getString(R.string.role_banner_artwork), "VK ›", "https://vk.com/son583");
+ addPersonCustomLink(activity, timeline, "Dysis", activity.getString(R.string.role_app_icon), "TG ›", "https://t.me/Eliatshaha");
endChapter(timeline);
- addChapter(activity, timeline, "The Community", "Join thousands of players who use Canvas every day.", false);
+ addChapter(activity, timeline, activity.getString(R.string.about_chapter_community), activity.getString(R.string.about_chapter_community_sub), false);
addCommunityCard(activity, timeline, "Discord", "https://discord.gg/FrHP57VRPs", "https://discord.gg/FrHP57VRPs");
- addCommunityCard(activity, timeline, "English Telegram", "t.me/skyautowax", "https://t.me/skyautowax");
- addCommunityCard(activity, timeline, "Russian Telegram", "t.me/skyruswax", "https://t.me/s/ruautowax");
+ addCommunityCard(activity, timeline, activity.getString(R.string.community_english_telegram), "t.me/skyautowax", "https://t.me/skyautowax");
+ addCommunityCard(activity, timeline, activity.getString(R.string.community_russian_telegram), "t.me/skyruswax", "https://t.me/s/ruautowax");
endChapter(timeline);
dialog.findViewById(R.id.thatgamecompanyLink).setOnClickListener(v ->
diff --git a/app/src/main/java/git/artdeell/skymodloader/MainActivity.java b/app/src/main/java/git/artdeell/skymodloader/MainActivity.java
index 8ce6cb6..9aead9c 100644
--- a/app/src/main/java/git/artdeell/skymodloader/MainActivity.java
+++ b/app/src/main/java/git/artdeell/skymodloader/MainActivity.java
@@ -470,7 +470,7 @@ private void copyToClipboard(String stackTrace) {
ClipData clip = ClipData.newPlainText("Stack Trace", stackTrace);
clipboard.setPrimaryClip(clip);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
- Toast.makeText(this, "Stack trace copied to clipboard", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, R.string.toast_stack_trace_copied, Toast.LENGTH_SHORT).show();
}
}
diff --git a/app/src/main/java/git/artdeell/skymodloader/SettingsActivity.java b/app/src/main/java/git/artdeell/skymodloader/SettingsActivity.java
index 619106b..8f0bdf2 100644
--- a/app/src/main/java/git/artdeell/skymodloader/SettingsActivity.java
+++ b/app/src/main/java/git/artdeell/skymodloader/SettingsActivity.java
@@ -90,10 +90,10 @@ public void afterTextChanged(Editable s) {
} else {
startService(logcatIntent);
}
- Toast.makeText(this, "Logcat monitoring enabled", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, R.string.toast_logcat_enabled, Toast.LENGTH_SHORT).show();
} else {
stopService(logcatIntent);
- Toast.makeText(this, "Logcat monitoring disabled", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, R.string.toast_logcat_disabled, Toast.LENGTH_SHORT).show();
}
});
@@ -171,9 +171,7 @@ private void resetBootloaderToOriginal() {
.putBoolean("use_custom_bootloader", false)
.putInt("bootloader_version", -1)
.apply();
- Toast.makeText(this,
- "Reset applied. Original version will be extracted at the next launch.",
- Toast.LENGTH_LONG).show();
+ Toast.makeText(this, R.string.toast_bootloader_reset, Toast.LENGTH_LONG).show();
}
private void copyBootloaderFromUri(Uri uri) {
@@ -199,7 +197,7 @@ private void copyBootloaderFromUri(Uri uri) {
Log.i(TAG, "Custom libBootloader.so copied: " + dest.length() / 1024 + " KB");
runOnUiThread(() -> Toast.makeText(this,
- "✓ Custom libBootloader.so applied!",
+ R.string.toast_bootloader_applied,
Toast.LENGTH_LONG).show());
} catch (Exception e) {
@@ -220,7 +218,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
private void executeClearAppData() {
- Toast.makeText(this, "Clearing data...", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, R.string.toast_clearing_data, Toast.LENGTH_SHORT).show();
new Thread(() -> {
int deletedFiles = 0;
int deletedDirs = 0;
@@ -250,7 +248,7 @@ private void executeClearAppData() {
runOnUiThread(() -> {
Toast.makeText(this,
- "Cleared " + totalFiles + " files, " + totalDirs + " dirs\nRestarting...",
+ getString(R.string.toast_cleared_data, totalFiles, totalDirs),
Toast.LENGTH_LONG).show();
new android.os.Handler().postDelayed(() -> {
Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
diff --git a/app/src/main/java/git/artdeell/skymodloader/elfmod/ModManagerActivity.java b/app/src/main/java/git/artdeell/skymodloader/elfmod/ModManagerActivity.java
index 81dbddd..a6bec37 100644
--- a/app/src/main/java/git/artdeell/skymodloader/elfmod/ModManagerActivity.java
+++ b/app/src/main/java/git/artdeell/skymodloader/elfmod/ModManagerActivity.java
@@ -212,10 +212,10 @@ public void setLogcatEnabled(boolean flag) {
} else {
startService(logcatIntent);
}
- Toast.makeText(this, "Logcat monitoring enabled", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, R.string.toast_logcat_enabled, Toast.LENGTH_SHORT).show();
} else {
stopService(logcatIntent);
- Toast.makeText(this, "Logcat monitoring disabled", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, R.string.toast_logcat_disabled, Toast.LENGTH_SHORT).show();
}
}
@@ -427,7 +427,7 @@ private void clearAppDataSelective() {
}
runOnUiThread(() -> {
- Toast.makeText(this, "Data cleared. Restarting...", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, R.string.toast_data_cleared_restarting, Toast.LENGTH_SHORT).show();
new android.os.Handler().postDelayed(() -> {
Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
if (intent != null) {
diff --git a/app/src/main/res/layout/about_dialog.xml b/app/src/main/res/layout/about_dialog.xml
index cf0e39f..60191da 100644
--- a/app/src/main/res/layout/about_dialog.xml
+++ b/app/src/main/res/layout/about_dialog.xml
@@ -82,7 +82,7 @@
android:id="@+id/thatgamecompanyLink"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="Sky is made by thatgamecompany"
+ android:text="@string/sky_attribution"
android:textSize="11sp"
android:alpha="0.3"
android:padding="8dp"
@@ -93,7 +93,7 @@
android:id="@+id/dialog_info_close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Close"
+ android:text="@string/close"
android:textSize="15sp"
android:textStyle="bold"
android:gravity="center"
diff --git a/app/src/main/res/layout/dialog_clear_data.xml b/app/src/main/res/layout/dialog_clear_data.xml
index 9900788..97c6377 100644
--- a/app/src/main/res/layout/dialog_clear_data.xml
+++ b/app/src/main/res/layout/dialog_clear_data.xml
@@ -10,7 +10,7 @@
@@ -72,7 +72,7 @@
@@ -45,14 +45,14 @@
@@ -90,14 +90,14 @@
@@ -117,7 +117,7 @@
android:id="@+id/dialog_bootloader_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="Cancel"
+ android:text="@string/cancel"
android:textSize="13sp"
android:alpha="0.4"
android:layout_gravity="end"
diff --git a/app/src/main/res/layout/dialog_x.xml b/app/src/main/res/layout/dialog_x.xml
index fe763c6..f3436b7 100644
--- a/app/src/main/res/layout/dialog_x.xml
+++ b/app/src/main/res/layout/dialog_x.xml
@@ -34,7 +34,7 @@
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginBottom="10dp"
- android:text="TITLE"
+ android:text="@string/dialog_title_placeholder"
android:textSize="20sp"
android:textStyle="bold" />
@@ -66,7 +66,7 @@
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
- android:text="DESCRIPTION"
+ android:text="@string/dialog_description_placeholder"
tools:text="Description" />
@@ -119,7 +119,7 @@
android:layout_margin="10dp"
android:layout_weight="1"
android:background="@drawable/buttons_3"
- android:text="Cancel"
+ android:text="@string/cancel"
android:textAllCaps="false"
android:textColor="@color/white" />
@@ -130,7 +130,7 @@
android:layout_margin="10dp"
android:layout_weight="1"
android:background="@drawable/buttons_2"
- android:text="NATRUAL"
+ android:text="@string/dialog_button_natural"
android:textAllCaps="false"
android:textColor="@color/black" />
diff --git a/app/src/main/res/layout/mod_manager.xml b/app/src/main/res/layout/mod_manager.xml
index 9cb3f45..fd0dfb7 100644
--- a/app/src/main/res/layout/mod_manager.xml
+++ b/app/src/main/res/layout/mod_manager.xml
@@ -122,7 +122,7 @@
@@ -195,7 +195,7 @@
android:layout_marginBottom="7dp"
android:background="@drawable/buttons"
android:gravity="center"
- android:text="GOOGLE PLAY STORE | GLOBAL VERSION\nPLAY"
+ android:text="@string/launch_google_play"
android:textSize="12sp"
android:maxLines="2" />
@@ -216,7 +216,7 @@
android:layout_height="54dp"
android:background="@drawable/buttons"
android:gravity="center"
- android:text="APP GALLERY | HUAWEI VERSION\nPLAY"
+ android:text="@string/launch_huawei"
android:textSize="12sp"
android:maxLines="2" />
diff --git a/app/src/main/res/layout/setting_layout.xml b/app/src/main/res/layout/setting_layout.xml
index 0931400..22eb640 100644
--- a/app/src/main/res/layout/setting_layout.xml
+++ b/app/src/main/res/layout/setting_layout.xml
@@ -37,7 +37,7 @@
android:id="@+id/setting_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="SETTINGS"
+ android:text="@string/settings_title"
android:textSize="20sp"
android:textStyle="bold"
android:letterSpacing="0.06" />
@@ -58,7 +58,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginBottom="6dp"
- android:text="General"
+ android:text="@string/section_general"
android:textSize="12sp"
android:textStyle="bold"
android:textAllCaps="true"
@@ -78,7 +78,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
- android:text="Hide Canvas menu"
+ android:text="@string/hide_canvas_menu"
android:textSize="15sp" />
@@ -169,7 +169,7 @@
android:id="@+id/server_url_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:hint="insert-url"
+ android:hint="@string/server_url_hint"
android:singleLine="true"
android:inputType="textUri"
android:textSize="14sp" />
@@ -188,7 +188,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
- android:text="Enable Logcat Monitoring"
+ android:text="@string/enable_logcat_monitoring"
android:textSize="15sp" />
@@ -276,7 +276,7 @@
@@ -284,7 +284,7 @@
+ Bitte den Mod-Manager starten und eine Version wählen (Live/Beta/Huawei). Sky ist nicht installiert — Canvas benötigt eine installierte Version von Sky!
+ Mod-Verwaltung
+ Mod hinzufügen
+ Ungültiger Mod. Fehlende Abhängigkeiten?
+ Mod konnte nicht entfernt werden
+ Andere Mods hängen davon ab — bitte zuerst diese entfernen!
+ %s hängt von dem Mod ab, den du entfernen möchtest
+ Ein-/Ausgabefehler
+ Allgemeiner Fehler
+ Mod konnte nicht hinzugefügt werden
+ Mod konnte nicht erkannt werden
+ Mod benötigt %s in Version %d.%d oder neuer, diese Abhängigkeit ist aber nicht verfügbar
+ Ein Mod mit diesem Namen existiert bereits
+ Updater überspringen
+ Anmelden mit %s
+ Sky Beta unterstützen
+ Spielen
+ Dev-Server
+ Bitte warten
+ Suche nach Updates…
+ Ein Update ist verfügbar!
+ Wird heruntergeladen…
+ Download abgeschlossen!
+ Überspringen
+ Aktualisieren
+ Installieren
+ Erneut versuchen
+ Update fehlgeschlagen
+ Heruntergeladene Daten sind beschädigt
+ Spiel ist nicht installiert
+ SPIELEN
+ MODS
+ Nach Updates für [%1$s] suchen?
+ Prüfung fehlgeschlagen
+ Update fehlgeschlagen
+ Das Update startet nach Bestätigung.
+ Prüfen
+ Neues Update für %s verfügbar!
+ Installieren
+ Ein Update läuft bereits
+ Download läuft
+ AKTUELL
+ Mod ist auf dem neuesten Stand\nVersion: %1$s
+ Entfernen
+ Nach Updates suchen
+ Canvas-Menü ausblenden und Mods automatisch aktivieren
+ Spiel-Updates überspringen
+ Cheat Engine Server aktivieren
+ Eigener Server
+
+ Schließen
+ Mod-Symbol
+ Keine Update-Quelle vorhanden
+ Suche nach Updates…
+ Update gefunden!
+ Keine Updates verfügbar.
+ Update wird heruntergeladen…
+ Update wird installiert…
+ Update abgeschlossen!
+ Ein Fehler ist aufgetreten
+ EINSTELLUNGEN
+
+
+ Sky ist ein Spiel von thatgamecompany
+
+
+ ⚠️ App-Daten löschen
+ BLEIBT ERHALTEN
+ WIRD GELÖSCHT
+ ✕ Alles andere
+ Löschen
+ Abbrechen
+
+
+ Eigene libBootloader.so
+ Datei auswählen
+ Wähle eine eigene libBootloader.so aus dem Speicher, um den aktuellen Bootloader zu ersetzen
+ Original wiederherstellen
+ Eigene Datei löschen und das Original aus der Sky-APK neu entpacken
+
+
+ TITEL
+ BESCHREIBUNG
+
+
+ GOOGLE PLAY STORE | GLOBALE VERSION\nSPIELEN
+ APP GALLERY | HUAWEI-VERSION\nSPIELEN
+
+
+ Allgemein
+ Canvas-Menü ausblenden
+ Entwickleroptionen
+ Cheat Engine Server
+ Eigener Server
+ Server-Adresse
+ Logcat-Protokollierung
+ Erweitert
+ Eigene libBootloader.so
+ Eigenen Bootloader auswählen oder Original wiederherstellen
+ App-Daten löschen
+ Alle Daten löschen außer Mods, ThatSkyMod-Ordner und user.xml
+
+
+ Der Ursprung
+ Von zwei Entwicklern aus Liebe zu Sky erschaffen.
+ Heute
+ Canvas lebt dank ihnen weiter.
+ Das Team
+ Alle, die Canvas besser gemacht haben.
+ Gestaltung
+ Die kreativen Köpfe hinter dem Design.
+ Community
+ Werde Teil von Tausenden Spielern, die Canvas täglich nutzen.
+
+
+ Autor
+ Ehemaliger Autor
+ Maintainer
+ Banner-Design
+ App-Icon
+
+
+ Telegram (English)
+ Telegram (Russisch)
+
+
+ Stacktrace in Zwischenablage kopiert
+ Logcat-Protokollierung aktiviert
+ Logcat-Protokollierung deaktiviert
+ Zurückgesetzt. Das Original wird beim nächsten Start neu entpackt.
+ ✓ Eigene libBootloader.so angewendet!
+ Daten werden gelöscht…
+ %1$d Dateien, %2$d Ordner gelöscht\nNeustart…
+ Daten gelöscht. Neustart…
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..26d5d12
--- /dev/null
+++ b/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,136 @@
+
+ Откройте менеджер модов и выберите версию (Live/Beta/Huawei). Sky не установлена — для работы Canvas необходима установленная игра!
+ Менеджер модов
+ Добавить мод
+ Некорректный мод. Отсутствуют зависимости?
+ Не удалось удалить мод
+ Другие моды зависят от этого — сначала удалите их!
+ %s зависит от мода, который вы пытаетесь удалить
+ Ошибка ввода/вывода
+ Общая ошибка
+ Не удалось добавить мод
+ Не удалось распознать мод
+ Мод требует %s версии %d.%d или новее, но эта зависимость недоступна
+ Мод с таким названием уже существует
+ Пропустить обновление
+ Войти через %s
+ Поддержка Sky Beta
+ Играть
+ Dev-сервер
+ Подождите
+ Проверка обновлений…
+ Доступно обновление!
+ Загрузка…
+ Загрузка завершена!
+ Пропустить
+ Обновить
+ Установить
+ Повторить
+ Не удалось обновить
+ Загруженные данные повреждены
+ Игра не установлена
+ ИГРАТЬ
+ МОДЫ
+ Проверить обновления для [%1$s]?
+ Ошибка проверки
+ Ошибка обновления
+ Обновление начнётся после подтверждения.
+ Проверить
+ Доступно обновление для %s!
+ Установить
+ Обновление уже выполняется
+ Идёт загрузка
+ АКТУАЛЬНАЯ ВЕРСИЯ
+ Мод обновлён до последней версии\nВерсия: %1$s
+ Удалить
+ Проверить обновления
+ Скрыть меню Canvas и автоматически включать моды
+ Пропускать обновления игры
+ Включить сервер Cheat Engine
+ Свой сервер
+
+ Закрыть
+ иконка мода
+ Нет источника обновлений
+ Проверка обновлений…
+ Найдено обновление!
+ Обновлений нет.
+ Загрузка обновления…
+ Установка обновления…
+ Обновление завершено!
+ Произошла ошибка
+ НАСТРОЙКИ
+
+
+ Sky — игра от thatgamecompany
+
+
+ ⚠️ Очистка данных
+ СОХРАНЯЕТСЯ
+ УДАЛЯЕТСЯ
+ ✕ Всё остальное
+ Очистить
+ Отмена
+
+
+ Свой libBootloader.so
+ Выбрать файл
+ Выберите свой libBootloader.so из хранилища для замены текущего загрузчика
+ Вернуть оригинал
+ Удалить пользовательский файл и заново извлечь оригинал из APK Sky
+
+
+ ЗАГОЛОВОК
+ ОПИСАНИЕ
+
+
+ GOOGLE PLAY STORE | ГЛОБАЛЬНАЯ ВЕРСИЯ\nИГРАТЬ
+ APP GALLERY | ВЕРСИЯ HUAWEI\nИГРАТЬ
+
+
+ Основные
+ Скрыть меню Canvas
+ Для разработчиков
+ Сервер Cheat Engine
+ Свой сервер
+ Адрес сервера
+ Мониторинг Logcat
+ Дополнительно
+ Свой libBootloader.so
+ Выбрать свой загрузчик или вернуть оригинал
+ Очистка данных
+ Удалить все данные кроме модов, папок ThatSkyMod и user.xml
+
+
+ Корни
+ Создан с нуля двумя разработчиками, влюблёнными в Sky.
+ Сегодня
+ Canvas жив благодаря им.
+ Команда
+ Все, кто сделал Canvas лучше.
+ Оформление
+ Авторы визуального стиля.
+ Сообщество
+ Присоединяйтесь к тысячам игроков, использующих Canvas каждый день.
+
+
+ Автор
+ Автор · бывший
+ Мейнтейнер
+ Автор баннера
+ Автор иконки
+
+
+ Telegram (English)
+ Telegram (Русский)
+
+
+ Стек вызовов скопирован
+ Мониторинг Logcat включён
+ Мониторинг Logcat выключен
+ Сброс выполнен. Оригинал будет извлечён при следующем запуске.
+ ✓ Свой libBootloader.so применён!
+ Очистка данных…
+ Удалено файлов: %1$d, папок: %2$d\nПерезапуск…
+ Данные очищены. Перезапуск…
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3ff9ad4..1e5de4d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,9 +1,9 @@
- Canvas
+ Canvas
Open Mod Manager and choose Live/Beta/Huawei. Sky is not installed. You must have Sky installed in order to use this!
Mod Manager
Add mod
- %s (%s)
+ %s (%s)
Invalid mod. Missing dependencies?
Unable to remove mod
You have mods that depend on this mod, please remove them first!
@@ -14,8 +14,8 @@
Mod is not readable
Mod depends on %s %d.%d or newer, but it is not available
A mod under this name already exists
- %d.%d.%d
- Skip the updater
+ %d.%d.%d
+ Skip the updater
Sign in with %s
Enable Sky Beta support
Play
@@ -31,10 +31,10 @@
Retry
Failed to update
Downloaded data not readable
- Canvas %s
- huawei
- Beta
- Live
+ Canvas %s
+ Huawei
+ Beta
+ Live
Game is not installed
PLAY
MODS
@@ -43,7 +43,7 @@
"Updating Failed"
Note: Update will start if you feel OK.
Check
- Version: %s\n%s
+ Version: %s\n%s
%s Has a new update!!
Install
Updater is busy
@@ -68,4 +68,85 @@
Update complete!
An error has occurred
SETTINGS
+
+
+ Sky is made by thatgamecompany
+
+
+ ⚠️ Clear App Data
+ PRESERVED
+ ✓ mods/
+ ✓ Accounts/
+ ✓ config/
+ ✓ AccountAuthInfo.bin
+ ✓ shared_prefs/user.xml
+ DELETED
+ ✕ Everything else
+ Clear
+ Cancel
+
+
+ Custom libBootloader.so
+ Pick file
+ Choose a custom libBootloader.so file from the storage to replace the current bootloader
+ Reset to original
+ Delete the custom file and re-extract the original from Sky\'s APK
+
+
+ TITLE
+ DESCRIPTION
+ 0%
+ NATURAL
+
+
+ GOOGLE PLAY STORE | GLOBAL VERSION\nPLAY
+ APP GALLERY | HUAWEI VERSION\nPLAY
+
+
+ General
+ Hide Canvas menu
+ Developer Options
+ Cheat Engine Server
+ Custom server
+ Server URL
+ insert-url
+ Enable Logcat Monitoring
+ Advanced
+ Custom libBootloader.so
+ Pick a custom bootloader or reset to original
+ Clear App Data
+ Delete all data except mods, ThatSkyMod\'s folders and user.xml
+
+
+ The Origin
+ Built from scratch by two developers who love Sky.
+ The Present
+ Currently keeping Canvas alive.
+ The Team
+ Everyone who made Canvas better.
+ The Art
+ The faces behind the visuals.
+ The Community
+ Join thousands of players who use Canvas every day.
+
+
+ Author
+ Author · retired
+ Maintainer
+ Banner artwork
+ App icon
+
+
+ English Telegram
+ Russian Telegram
+
+
+ Stack trace copied to clipboard
+ Logcat monitoring enabled
+ Logcat monitoring disabled
+ Reset applied. Original version will be extracted at the next launch.
+ ✓ Custom libBootloader.so applied!
+ Clearing data…
+ Cleared %1$d files, %2$d dirs\nRestarting…
+ Data cleared. Restarting…
\ No newline at end of file
diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml
new file mode 100644
index 0000000..431166d
--- /dev/null
+++ b/app/src/main/res/xml/locales_config.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+