Multiple Language Support
This is similar to https://gerrit.omnirom.org/#/c/14014
A lot of the features built in the older patch set have been split
out into separate patches, most of which have already been merged.
The remaining functionality here should all be directly related to
language selection and loading. We always load English as a base
before loading other languages over the top of the base. The idea
is that if another language is missing a translation, then we will
still display the English.
Maybe still to do: read the /cache/recovery/last_locale file and
load a language based on that. For me, this file contains just:
en_US
We probably won't bother with region specific translations so we
would have to look at either trimming off the _US or using some
other method like perhaps a symlink or a combination of the two.
Thanks to _that for twmsg.cpp class
Change-Id: I9647a22e47883a3ddd2de1da51f64aab7c328f74
diff --git a/Android.mk b/Android.mk
index 33a43d8..61435c3 100644
--- a/Android.mk
+++ b/Android.mk
@@ -329,6 +329,11 @@
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
LOCAL_CFLAGS += -DTW_USE_NEW_MINADBD
endif
+ifneq ($(TW_DEFAULT_LANGUAGE),)
+ LOCAL_CFLAGS += -DTW_DEFAULT_LANGUAGE=$(TW_DEFAULT_LANGUAGE)
+else
+ LOCAL_CFLAGS += -DTW_DEFAULT_LANGUAGE=en
+endif
LOCAL_ADDITIONAL_DEPENDENCIES := \
dump_image \
diff --git a/data.cpp b/data.cpp
index 9f2e6b5..6b0f971 100644
--- a/data.cpp
+++ b/data.cpp
@@ -50,6 +50,7 @@
#include "find_file.hpp"
#include "set_metadata.h"
#include <cutils/properties.h>
+#include "gui/gui.hpp"
#define DEVID_MAX 64
#define HWID_MAX 32
@@ -229,7 +230,7 @@
}
strcpy(device_id, "serialno");
- LOGERR("=> device id not found, using '%s'\n", device_id);
+ LOGINFO("=> device id not found, using '%s'\n", device_id);
mConstValues.insert(make_pair("device_id", device_id));
return;
}
@@ -616,8 +617,10 @@
}
}
} else {
- if (PartitionManager.Fstab_Processed() != 0)
- LOGERR("Storage partition '%s' not found\n", str.c_str());
+ if (PartitionManager.Fstab_Processed() != 0) {
+ LOGINFO("Storage partition '%s' not found\n", str.c_str());
+ gui_err("unable_locate_storage=Unable to locate storage device.");
+ }
}
}
@@ -890,6 +893,8 @@
#endif
mValues.insert(make_pair("tw_mount_system_ro", make_pair("2", 1)));
mValues.insert(make_pair("tw_never_show_system_ro_page", make_pair("0", 1)));
+ mValues.insert(make_pair("tw_language", make_pair(EXPAND(TW_DEFAULT_LANGUAGE), 1)));
+ LOGINFO("LANG: %s\n", EXPAND(TW_DEFAULT_LANGUAGE));
pthread_mutex_unlock(&m_valuesLock);
}
@@ -1033,7 +1038,7 @@
}
FILE *fp = fopen(Path.c_str(), "w");
if (fp == NULL) {
- LOGERR("Unable to open '%s'.\n", Path.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Path)(strerror(errno)));
return;
}
strcpy(version, TW_VERSION_STR);
@@ -1069,7 +1074,7 @@
{
usleep(500000);
if (!PartitionManager.Mount_Settings_Storage(false))
- LOGERR("Unable to mount %s when trying to read settings file.\n", settings_file);
+ gui_msg(Msg(msg::kError, "unable_to_mount=Unable to mount {1}")(settings_file));
}
mkdir(mkdir_path, 0777);
diff --git a/find_file.cpp b/find_file.cpp
index 78db534..7f4191e 100644
--- a/find_file.cpp
+++ b/find_file.cpp
@@ -48,7 +48,7 @@
d = opendir(starting_path.c_str());
if (d == NULL) {
- LOGERR("Find_File: Error opening '%s'\n", starting_path.c_str());
+ LOGINFO("Find_File: Error opening '%s'\n", starting_path.c_str());
return "";
}
diff --git a/gui/Android.mk b/gui/Android.mk
index 66883a4..84f890c 100644
--- a/gui/Android.mk
+++ b/gui/Android.mk
@@ -28,7 +28,8 @@
mousecursor.cpp \
scrolllist.cpp \
patternpassword.cpp \
- textbox.cpp
+ textbox.cpp \
+ twmsg.cpp
ifneq ($(TWRP_CUSTOM_KEYBOARD),)
LOCAL_SRC_FILES += $(TWRP_CUSTOM_KEYBOARD)
@@ -107,6 +108,7 @@
ifeq ($(TWRP_NEW_THEME),true)
TWRP_THEME_LOC := $(commands_recovery_local_path)/gui/theme/$(TW_THEME)
TWRP_RES := $(commands_recovery_local_path)/gui/theme/common/fonts
+ TWRP_RES += $(commands_recovery_local_path)/gui/theme/common/languages
TWRP_RES += $(commands_recovery_local_path)/gui/theme/common/$(word 1,$(subst _, ,$(TW_THEME))).xml
# for future copying of used include xmls and fonts:
# UI_XML := $(TWRP_THEME_LOC)/ui.xml
diff --git a/gui/action.cpp b/gui/action.cpp
index 46f4575..3e27dbb 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -197,6 +197,7 @@
ADD_ACTION(cancelbackup);
ADD_ACTION(checkpartitionlifetimewrites);
ADD_ACTION(mountsystemtoggle);
+ ADD_ACTION(setlanguage);
// remember actions that run in the caller thread
for (mapFunc::const_iterator it = mf.begin(); it != mf.end(); ++it)
@@ -340,12 +341,12 @@
void GUIAction::simulate_progress_bar(void)
{
- gui_print("Simulating actions...\n");
+ gui_msg("simulating=Simulating actions...");
for (int i = 0; i < 5; i++)
{
if (PartitionManager.stop_backup.get_value()) {
DataManager::SetValue("tw_cancel_backup", 1);
- gui_print("Backup Canceled.\n");
+ gui_msg("backup_cancel=Backup Canceled.");
DataManager::SetValue("ui_progress", 0);
PartitionManager.stop_backup.set_value(0);
return;
@@ -381,10 +382,10 @@
{
DataManager::SetValue("tw_operation", "Configuring TWRP");
DataManager::SetValue("tw_partition", "");
- gui_print("Configuring TWRP...\n");
+ gui_msg("config_twrp=Configuring TWRP...");
if (TWFunc::Exec_Cmd("/sbin/installTwrp reinstall") < 0)
{
- gui_print("Unable to configure TWRP with this kernel.\n");
+ gui_msg("config_twrp_err=Unable to configure TWRP with this kernel.");
}
}
}
@@ -587,12 +588,12 @@
if (!simulate)
PartitionManager.usb_storage_enable();
else
- gui_print("Simulating actions...\n");
+ gui_msg("simulating=Simulating actions...");
} else if (!simulate) {
PartitionManager.Mount_By_Path(arg, true);
PartitionManager.Add_MTP_Storage(arg);
} else
- gui_print("Simulating actions...\n");
+ gui_msg("simulating=Simulating actions...");
return 0;
}
@@ -602,12 +603,12 @@
if (!simulate)
PartitionManager.usb_storage_disable();
else
- gui_print("Simulating actions...\n");
+ gui_msg("simulating=Simulating actions...");
DataManager::SetValue(TW_ACTION_BUSY, 0);
} else if (!simulate) {
PartitionManager.UnMount_By_Path(arg, true);
} else
- gui_print("Simulating actions...\n");
+ gui_msg("simulating=Simulating actions...");
return 0;
}
@@ -615,7 +616,7 @@
{
operation_start("Restore Defaults");
if (simulate) // Simulated so that people don't accidently wipe out the "simulation is on" setting
- gui_print("Simulating actions...\n");
+ gui_msg("simulating=Simulating actions...");
else {
DataManager::ResetDefaults();
PartitionManager.Update_System_Details();
@@ -636,7 +637,7 @@
TWFunc::copy_file("/tmp/recovery.log", dst.c_str(), 0755);
tw_set_default_metadata(dst.c_str());
sync();
- gui_print("Copied recovery log to %s.\n", DataManager::GetCurrentStoragePath().c_str());
+ gui_msg(Msg("copy_log=Copied recovery log to {1}.")(DataManager::GetCurrentStoragePath()));
} else
simulate_progress_bar();
operation_end(0);
@@ -733,7 +734,7 @@
int GUIAction::queuezip(std::string arg __unused)
{
if (zip_queue_index >= 10) {
- gui_print("Maximum zip queue reached!\n");
+ gui_msg("max_queue=Maximum zip queue reached!");
return 0;
}
DataManager::GetValue("tw_filename", zip_queue[zip_queue_index]);
@@ -747,7 +748,7 @@
int GUIAction::cancelzip(std::string arg __unused)
{
if (zip_queue_index <= 0) {
- gui_print("Minimum zip queue reached!\n");
+ gui_msg("min_queue=Minimum zip queue reached!");
return 0;
} else {
zip_queue_index--;
@@ -925,7 +926,7 @@
chmod(path, 0666);
chown(path, uid, gid);
- gui_print("Screenshot was saved to %s\n", path);
+ gui_msg(Msg("screenshot_saved=Screenshot was saved to %s")(path));
// blink to notify that the screenshow was taken
gr_color(255, 255, 255, 255);
@@ -933,7 +934,7 @@
gr_flip();
gui_forceRender();
} else {
- LOGERR("Failed to take a screenshot!\n");
+ gui_err("screenshot_err=Failed to take a screenshot!");
}
return 0;
}
@@ -959,7 +960,7 @@
void GUIAction::reinject_after_flash()
{
if (DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
- gui_print("Injecting TWRP into boot image...\n");
+ gui_msg("injecttwrp=Injecting TWRP into boot image...");
if (simulate) {
simulate_progress_bar();
} else {
@@ -970,7 +971,7 @@
string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
TWFunc::Exec_Cmd(injectcmd);
}
- gui_print("TWRP injection complete.\n");
+ gui_msg("done=Done.");
}
}
}
@@ -993,7 +994,7 @@
ret_val = flash_zip(zip_path, &wipe_cache);
TWFunc::SetPerformanceMode(false);
if (ret_val != 0) {
- gui_print("Error flashing zip '%s'\n", zip_path.c_str());
+ gui_msg(Msg(msg::kError, "zip_err=Error installing zip file '{1}'")(zip_path));
ret_val = 1;
break;
}
@@ -1001,7 +1002,7 @@
zip_queue_index = 0;
if (wipe_cache) {
- gui_print("One or more zip requested a cache wipe\nWiping cache now.\n");
+ gui_msg("zip_wipe_cache=One or more zip requested a cache wipe -- Wiping cache now.");
PartitionManager.Wipe_By_Path("/cache");
}
@@ -1063,7 +1064,7 @@
LOGINFO("wipe_path '%s'\n", wipe_path.c_str());
if (wipe_path == "/and-sec") {
if (!PartitionManager.Wipe_Android_Secure()) {
- LOGERR("Unable to wipe android secure\n");
+ gui_msg("and_sec_wipe_err=Unable to wipe android secure");
ret_val = false;
break;
} else {
@@ -1071,7 +1072,7 @@
}
} else if (wipe_path == "DALVIK") {
if (!PartitionManager.Wipe_Dalvik_Cache()) {
- LOGERR("Failed to wipe dalvik\n");
+ gui_err("dalvik_wipe_err=Failed to wipe dalvik");
ret_val = false;
break;
} else {
@@ -1087,7 +1088,7 @@
}
if (!skip) {
if (!PartitionManager.Wipe_By_Path(wipe_path)) {
- LOGERR("Unable to wipe '%s'\n", wipe_path.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(wipe_path));
ret_val = false;
break;
} else if (wipe_path == DataManager::GetSettingsStoragePath()) {
@@ -1152,6 +1153,8 @@
if (arg == "backup") {
string Backup_Name;
DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
+ string auto_gen = gui_lookup("auto_gen", "(Auto Generate)");
+ string curr_date = gui_lookup("curr_date", "(Current Date)");
if (Backup_Name == "(Auto Generate)" || Backup_Name == "(Current Date)" || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(true) == 0) {
ret = PartitionManager.Run_Backup();
}
@@ -1159,7 +1162,7 @@
operation_end(1);
return -1;
}
- DataManager::SetValue(TW_BACKUP_NAME, "(Auto Generate)");
+ DataManager::SetValue(TW_BACKUP_NAME, auto_gen);
} else if (arg == "restore") {
string Restore_Name;
DataManager::GetValue("tw_restore", Restore_Name);
@@ -1178,7 +1181,7 @@
}
else {
DataManager::SetValue("tw_cancel_backup", 1);
- gui_print("Backup Canceled.\n");
+ gui_msg("backup_cancel=Backup Canceled.");
ret = 0;
}
operation_end(ret);
@@ -1242,7 +1245,7 @@
int allow_partition;
DataManager::GetValue(TW_ALLOW_PARTITION_SDCARD, allow_partition);
if (allow_partition == 0) {
- gui_print("This device does not have a real SD Card!\nAborting!\n");
+ gui_err("no_real_sdcard=This device does not have a real SD Card! Aborting!");
} else {
if (!PartitionManager.Partition_SDCard())
ret_val = 1; // failed
@@ -1332,7 +1335,7 @@
fp = popen(command.c_str(), "r");
if (fp == NULL) {
- LOGERR("Error opening command to run.\n");
+ LOGERR("Error opening command to run (%s).\n", strerror(errno));
} else {
int fd = fileno(fp), has_data = 0, check = 0, keep_going = -1, bytes_read = 0;
struct timeval timeout;
@@ -1391,12 +1394,12 @@
{
int op_status = 0;
operation_start("ReinjectTWRP");
- gui_print("Injecting TWRP into boot image...\n");
+ gui_msg("injecttwrp=Injecting TWRP into boot image...");
if (simulate) {
simulate_progress_bar();
} else {
TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
- gui_print("TWRP injection complete.\n");
+ gui_msg("done=Done.");
}
operation_end(op_status);
@@ -1462,7 +1465,7 @@
simulate_progress_bar();
operation_end(0);
} else {
- gui_print("Starting ADB sideload feature...\n");
+ gui_msg("start_sideload=Starting ADB sideload feature...");
bool mtp_was_enabled = TWFunc::Toggle_MTP(false);
// wait for the adb connection
@@ -1471,7 +1474,7 @@
if (ret != 0) {
if (ret == -2)
- gui_print("You need adb 1.0.32 or newer to sideload to this device.\n");
+ gui_msg("need_new_adb=You need adb 1.0.32 or newer to sideload to this device.");
ret = 1; // failure
} else {
int wipe_cache = 0;
@@ -1509,7 +1512,7 @@
{
struct stat st;
DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui
- gui_print("Cancelling ADB sideload...\n");
+ gui_msg("cancel_sideload=Cancelling ADB sideload...");
LOGINFO("Signaling child sideload process to exit.\n");
// Calling stat() on this magic filename signals the minadbd
// subprocess to shut down.
@@ -1543,7 +1546,7 @@
// Run those first.
int reboot = 0;
if (TWFunc::Path_Exists(SCRIPT_FILE_TMP)) {
- gui_print("Processing AOSP recovery commands...\n");
+ gui_msg("running_recovery_commands=Running Recovery Commands");
if (OpenRecoveryScript::run_script_file() == 0) {
reboot = 1;
op_status = 0;
@@ -1551,7 +1554,7 @@
}
// Check for the ORS file in /cache and attempt to run those commands.
if (OpenRecoveryScript::check_for_script_file()) {
- gui_print("Processing OpenRecoveryScript file...\n");
+ gui_msg("running_ors=Running OpenRecoveryScript");
if (OpenRecoveryScript::run_script_file() == 0) {
reboot = 1;
op_status = 0;
@@ -1640,7 +1643,6 @@
if (PartitionManager.Repair_By_Path(part_path, true)) {
op_status = 0; // success
} else {
- LOGERR("Error repairing file system.\n");
op_status = 1; // fail
}
}
@@ -1662,7 +1664,6 @@
if (PartitionManager.Resize_By_Path(part_path, true)) {
op_status = 0; // success
} else {
- LOGERR("Error resizing file system.\n");
op_status = 1; // fail
}
}
@@ -1685,7 +1686,7 @@
if (PartitionManager.Wipe_By_Path(part_path, file_system)) {
op_status = 0; // success
} else {
- LOGERR("Error changing file system.\n");
+ gui_err("change_fs_err=Error changing file system.");
op_status = 1; // fail
}
}
@@ -1826,3 +1827,16 @@
operation_end(op_status);
return 0;
}
+
+int GUIAction::setlanguage(std::string arg __unused)
+{
+ int op_status = 0;
+
+ operation_start("Set Language");
+ PageManager::LoadLanguage(DataManager::GetStrValue("tw_language"));
+ PageManager::RequestReload();
+ op_status = 0; // success
+
+ operation_end(op_status);
+ return 0;
+}
diff --git a/gui/console.cpp b/gui/console.cpp
index 6b38d61..b5204fb 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -1,3 +1,21 @@
+/*
+ Copyright 2015 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
// console.cpp - GUIConsole object
#include <stdarg.h>
@@ -24,10 +42,16 @@
#include "rapidxml.hpp"
#include "objects.hpp"
+#include "gui.hpp"
+#include "twmsg.h"
+#define GUI_CONSOLE_BUFFER_SIZE 512
-static std::vector<std::string> gConsole;
-static std::vector<std::string> gConsoleColor;
+size_t last_message_count = 0;
+std::vector<Message> gMessages;
+
+std::vector<std::string> gConsole;
+std::vector<std::string> gConsoleColor;
static FILE* ors_file;
extern "C" void __gui_print(const char *color, char *buf)
@@ -58,22 +82,22 @@
gConsole.push_back(start);
gConsoleColor.push_back(color);
}
- if (ors_file) {
- fprintf(ors_file, "%s\n", buf);
- fflush(ors_file);
- }
}
extern "C" void gui_print(const char *fmt, ...)
{
- char buf[512]; // We're going to limit a single request to 512 bytes
+ char buf[GUI_CONSOLE_BUFFER_SIZE]; // We're going to limit a single request to 512 bytes
va_list ap;
va_start(ap, fmt);
- vsnprintf(buf, 512, fmt, ap);
+ vsnprintf(buf, GUI_CONSOLE_BUFFER_SIZE, fmt, ap);
va_end(ap);
fputs(buf, stdout);
+ if (ors_file) {
+ fprintf(ors_file, "%s", buf);
+ fflush(ors_file);
+ }
__gui_print("normal", buf);
return;
@@ -81,14 +105,18 @@
extern "C" void gui_print_color(const char *color, const char *fmt, ...)
{
- char buf[512]; // We're going to limit a single request to 512 bytes
+ char buf[GUI_CONSOLE_BUFFER_SIZE]; // We're going to limit a single request to 512 bytes
va_list ap;
va_start(ap, fmt);
- vsnprintf(buf, 512, fmt, ap);
+ vsnprintf(buf, GUI_CONSOLE_BUFFER_SIZE, fmt, ap);
va_end(ap);
fputs(buf, stdout);
+ if (ors_file) {
+ fprintf(ors_file, "%s", buf);
+ fflush(ors_file);
+ }
__gui_print(color, buf);
return;
@@ -99,6 +127,70 @@
ors_file = f;
}
+void gui_msg(const char* text)
+{
+ if (text) {
+ Message msg = Msg(text);
+ gui_msg(msg);
+ }
+}
+
+void gui_warn(const char* text)
+{
+ if (text) {
+ Message msg = Msg(msg::kWarning, text);
+ gui_msg(msg);
+ }
+}
+
+void gui_err(const char* text)
+{
+ if (text) {
+ Message msg = Msg(msg::kError, text);
+ gui_msg(msg);
+ }
+}
+
+void gui_highlight(const char* text)
+{
+ if (text) {
+ Message msg = Msg(msg::kHighlight, text);
+ gui_msg(msg);
+ }
+}
+
+void gui_msg(Message msg)
+{
+ std::string output = msg;
+ output += "\n";
+ fputs(output.c_str(), stdout);
+ if (ors_file) {
+ fprintf(ors_file, "%s", output.c_str());
+ fflush(ors_file);
+ }
+ gMessages.push_back(msg);
+}
+
+void GUIConsole::Translate_Now() {
+ size_t message_count = gMessages.size();
+ if (message_count <= last_message_count)
+ return;
+
+ for (size_t m = last_message_count; m < message_count; m++) {
+ std::string message = gMessages[m];
+ std::string color = "normal";
+ if (gMessages[m].GetKind() == msg::kError)
+ color = "error";
+ else if (gMessages[m].GetKind() == msg::kHighlight)
+ color = "highlight";
+ else if (gMessages[m].GetKind() == msg::kWarning)
+ color = "warning";
+ gConsole.push_back(message);
+ gConsoleColor.push_back(color);
+ }
+ last_message_count = message_count;
+}
+
GUIConsole::GUIConsole(xml_node<>* node) : GUIScrollList(node)
{
xml_node<>* child;
@@ -160,6 +252,7 @@
int GUIConsole::RenderConsole(void)
{
+ Translate_Now();
AddLines(&gConsole, &gConsoleColor, &mLastCount, &rConsole, &rConsoleColor);
GUIScrollList::Render();
diff --git a/gui/devices/common/res/languages/en.xml b/gui/devices/common/res/languages/en.xml
new file mode 100644
index 0000000..c11176a
--- /dev/null
+++ b/gui/devices/common/res/languages/en.xml
@@ -0,0 +1,226 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>English</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="mediumfont" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="filelist" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System Image</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor Image</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">Internal Storage</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+
+ <!-- GUI XML strings -->
+ <string name="install_button_text">Install</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Kernel does not have support for reading SELinux contexts.</string>
+ <string name="full_selinux">Full SELinux support is present.</string>
+ <string name="no_selinux">No SELinux support (no libselinux).</string>
+ <string name="mtp_enabled">MTP Enabled</string>
+ <string name="mtp_crash">MTP Crashed, not starting MTP on boot.</string>
+ <string name="rebooting">Rebooting...</string>
+ <string name="decrypt_success">Successfully decrypted with default password.</string>
+ <string name="unable_to_decrypt">Unable to decrypt with default password. You may need to perform a Format Data.</string>
+ <string name="generating_md51">Generating MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * Generating md5...</string>
+ <string name="md5_created"> * MD5 Created.</string>
+ <string name="md5_error"> * MD5 Error!</string>
+ <string name="md5_compute_error"> * Error computing MD5.</string>
+ <string name="md5_created"> * MD5 Created.</string>
+ <string name="current_date">(Current Date)</string>
+ <string name="auto_generate">(Auto Generate)</string>
+ <string name="unable_to_locate_partition">Unable to locate '{1}' partition for backup calculations.</string>
+ <string name="no_partition_selected">No partitions selected for backup.</string>
+ <string name="total_partitions_backup"> * Total number of partitions to back up: {1}</string>
+ <string name="total_backup_size"> * Total size of all data: {1}MB</string>
+ <string name="available_space"> * Available space: {1}MB</string>
+ <string name="unable_locate_storage">Unable to locate storage device.</string>
+ <string name="Not enough free space on storage.">Not enough free space on storage.</string>
+ <string name="backup_started">[BACKUP STARTED]</string>
+ <string name="backup_folder"> * Backup Folder: {1}</string>
+ <string name="fail_backup_folder">Failed to make backup folder.</string>
+ <string name="avg_backup_fs">Average backup rate for file systems: {1} MB/sec</string>
+ <string name="avg_backup_img">Average backup rate for imaged drives: {1} MB/sec</string>
+ <string name="total_backed_size">[{1} MB TOTAL BACKED UP]</string>
+ <string name="backup_completed">[BACKUP COMPLETED IN {1} SECONDS]</string>
+ <string name="restore_started">[RESTORE STARTED]</string>
+ <string name="restore_folder">Restore folder: '%s'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restort_part_done">[{1} done ({2} seconds)]</string>
+ <string name="verifying_md5">Verifying MD5</string>
+ <string name="skip_md5">Skipping MD5 check based on user setting.</string>
+ <string name="calc_restore">Calculating restore details...</string>
+ <string name="restore_read_only">Cannot restore %s -- mounted read only.</string>
+ <string name="restore_unable_locate">Unable to locate '{1}' partition for restoring.</string>
+ <string name="no_part_restore">No partitions selected for restore.</string>
+ <string name="restore_part_count">Restoring {1} partitions...</string>
+ <string name="total_restore_size">Total restore size is {1}MB</string>
+ <string name="updating_system_details">Updating System Details</string>
+ <string name="restore_complete">[RESTORE COMPLETED IN {1} SECONDS]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Error opening: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Unable to locate partition by backup name: '{1}'</string>
+ <string name="unable_find_part_path">Unable to find partition for path '{1}'</string>
+ <string name="update_part_details">Updating partition details...</string>
+ <string name="update_part_details_done">...done</string>
+ <string name="wiping_dalvik">Wiping Dalvik Cache Directories...</string>
+ <string name="cleaned">Cleaned: {1}...</string>
+ <string name="dalvik_done">-- Dalvik Cache Directories Wipe Complete!</string>
+ <string name="no_andsec">No android secure partitions found.</string>
+ <string name="unable_to_locate">Unable to locate {1}.</string>
+ <string name="wiping_datamedia">Wiping internal storage -- /data/media...</string>
+ <string name="unable_to_mount">Unable to mount {1}</string>
+ <string name="unable_to_mount_internal">Unable to mount internal_storage</string>
+ <string name="unable_to_mount_storage">Unable to mount storage</string>
+ <string name="fail_decrypt">Failed to decrypt data.</string>
+ <string name="no_crypto_support">No crypto support was compiled into this build.</string>
+ <string name="decrypt_success">Data successfully decrypted, new block device: '{1}'</string>
+ <string name="done">Done.</string>
+ <string name="start_partition_sd">Partitioning SD Card...</string>
+ <string name="partition_sd_locate">Unable to locate device to partition.</string>
+ <string name="ext_swap_size">EXT + Swap size is larger than sdcard size.</string>
+ <string name="remove_part_table">Removing partition table...</string>
+ <string name="unable_rm_part">Unable to remove partition table.</string>
+ <string name="create_part">Creating {1} partition...</string>
+ <string name="unable_to_create_part">Unable to create {1} partition.</string>
+ <string name="format_sdext_as">Formatting sd-ext as {1}...</string>
+ <string name="part_complete">Partitioning complete.</string>
+ <string name="unable_to_open">Unable to open '{1}'.</string>
+ <string name="mtp_already_enabled">MTP already enabled</string>
+ <string name="mtp_fail">Failed to enable MTP</string>
+ <string name="no_mtp">MTP support not included</string>
+ <string name="image_flash_start">[IMAGE FLASH STARTED]</string>
+ <string name="img_to_flash">Image to flash: '{1}'</string>
+ <string name="flash_unable_locate">Unable to locate '{1}' partition for flashing.</string>
+ <string name="no_part_flash">No partitions selected for flashing.</string>
+ <string name="too_many_flash">Too many partitions selected for flashing.</string>
+ <string name="invalid_flash">Invalid flash partition specified.</string>
+ <string name="flash_done">IMAGE FLASH COMPLETED]</string>
+ <string name="wiping">Wiping {1}</string>
+ <string name="repair_not_exist">{1} does not exist! Cannot repair!</string>
+ <string name="unable_repair">Unable to repair {1}.</string>
+ <string name="mount_data_footer">Could not mount /data and unable to find crypto footer.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Can not create '{1}' folder ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Failed to mount '{1}' ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_mount">Failed to unmount '{1}' ({2})</string>
+ <string name="cannot_resize">Cannot resize {1}.</string>
+ <string name="repair_resize">Repairing {1} before resizing.</string>
+ <string name="unable_resize">Unable to resize {1}.</string>
+ <string name="no_md5_found">No md5 file found for '{1}'. Please unselect Enable MD5 verification to restore.</string>
+ <string name="md5_fail_match">MD5 failed to match on '{1}'.</string>
+ <string name="restoring">Restoring</string>
+ <string name="format_data_msg">You may need to reboot recovery to be able to use /data again.</string>
+ <string name="format_data_err">Unable to format to remove encryption.</string>
+ <string name="formating_using">Formatting {1} using {2}...</string>
+ <string name="unable_to_wipe">Unable to wipe {1}.</string>
+ <string name="remove_all">Removing all files under '{1}'</string>
+ <string name="wiping_data">Wiping data without wiping /data/media ...</string>
+ <string name="backing_up">Backing up {1}...</string>
+ <string name="backing">Backing Up</string>
+ <string name="backup_size">Backup file size for '%s' is 0 bytes.</string>
+ <string name="datamedia_fs_restore">WARNING: This /data backup was made with {1} file system! The backup may not boot unless you change back to {1}.</string>
+ <string name="restoring">Restoring {1}...</string>
+ <string name="restore">Restoring</string>
+ <string name="recreate_folder_err">Unable to recreate {1} folder.</string>
+ <string name="img_size_err">Size of image is larger than target device</string>
+ <string name="flashing">Flashing {1}...</string>
+ <string name="backup_folder">Backup folder set to '{1}'</string>
+ <string name="locate_backup_err">Unable to locate backup '{1}'</string>
+ <string name="set_restore_opt">Setting restore options: '{1}':</string>
+ <string name="md5_check_skip">MD5 check skip is on</string>
+ <string name="ors_encrypt_restore_err">Unable to use OpenRecoveryScript to restore an encrypted backup.</string>
+ <string name="mounting">Mounting</string>
+ <string name="unmounting">Unmounting</string>
+ <string name="mounted">Mounted '{1}'</string>
+ <string name="unmounted">Unmounted '{1}'</string>
+ <string name="setting">Setting '{1}' to '{2}'</string>
+ <string name="setting_empty">Setting '{1}' to empty</string>
+ <string name="making_dir1">Making Directory</string>
+ <string name="making_dir2">Making directory: '{1}'</string>
+ <string name="running_command">Running Command</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Starting ADB sideload feature...</string>
+ <string name="need_new_adb">You need adb 1.0.32 or newer to sideload to this device.</string>
+ <string name="no_pwd">No password provided.</string>
+ <string name="done_ors">Done processing script file</string>
+ <string name="injecttwrp">Injecting TWRP into boot image...</string>
+ <string name="zip_err">Error installing zip file '{1}'</string>
+ <string name="installing_zip">Installing zip file '{1}'</string>
+ <string name="select_backup_opt">Setting backup options:</string>
+ <string name="compression_on">Compression is on</string>
+ <string name="md5_off">MD5 Generation is off</string>
+ <string name="backup_fail">Backup Failed</string>
+ <string name="backup_complete">Backup complete!</string>
+ <string name="running_recovery_commands">Running Recovery Commands</string>
+ <string name="recovery_commands_complete">Recovery Commands Complete</string>
+ <string name="running_ors">Running OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript Complete</string>
+ <string name="no_updater_binary">Could not find '{1}' in the zip file.</string>
+ <string name="check_for_md5">Checking for MD5 file...</string>
+ <string name="fail_sysmap">Failed to map file '{1}'</string>
+ <string name="verify_zip_sig">Verifying zip signature...</string>
+ <string name="verify_zip_fail">Zip signature verification failed!</string>
+ <string name="verify_zip_done">Zip signature verified successfully.</string>
+ <string name="zip_corrupt">Zip file is corrupt!</string>
+ <string name="no_md5">Skipping MD5 check: no MD5 file found</string>
+ <string name="md5_fail">MD5 does not match</string>
+ <string name="md5_match">MD5 matched</string>
+ <string name="pid_signal">{1} process ended with signal: {2}</string>
+ <string name="pid_error">{1} process ended with ERROR: {2}</string>
+ <string name="install_dumlock">Installing HTC Dumlock to system...</string>
+ <string name="dumlock_restore">Restoring original boot...</string>
+ <string name="dumlock_reflash">Reflashing recovery to boot...</string>
+ <string name="run_script">Running {1} script...</string>
+ <string name="rename_stock">Renamed stock recovery file in /system to prevent the stock ROM from replacing TWRP.</string>
+ <string name="split_backup">Breaking backup file into multiple archives...</string>
+ <string name="backup_error">Error creating backup.</string>
+ <string name="restore_error">Error during restore process.</string>
+ <string name="split_thread">Splitting thread ID {1} into archive {2}</string>
+ <string name="file_progress">%llu of %llu files, %i%%</string>
+ <string name="size_progress">%lluMB of %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Attempting to decrypt data partition via command line.</string>
+ <string name="base_pkg_err">Failed to load base packages.</string>
+ <string name="simulating">Simulating actions...</string>
+ <string name="backup_cancel">Backup Canceled.</string>
+ <string name="config_twrp">Configuring TWRP...</string>
+ <string name="config_twrp_err">Unable to configure TWRP with this kernel.</string>
+ <string name="copy_log">Copied recovery log to {1}.</string>
+ <string name="max_queue">Maximum zip queue reached!</string>
+ <string name="min_queue">Minimum zip queue reached!</string>
+ <string name="screenshot_err">Failed to take a screenshot!</string>
+ <string name="zip_wipe_cache">One or more zip requested a cache wipe -- Wiping cache now.</string>
+ <string name="and_sec_wipe_err">Unable to wipe android secure</string>
+ <string name="dalvik_wipe_err">Failed to wipe dalvik</string>
+ <string name="auto_gen">(Auto Generate)</string>
+ <string name="curr_date">(Current Date)</string>
+ <string name="backup_name_len">Backup name is too long.</string>
+ <string name="backup_name_invalid">Backup name '{1}' contains invalid character: '{1}'</string>
+ <string name="backup_name_exists">A backup with this name already exists.</string>
+ <string name="no_real_sdcard">This device does not have a real SD Card! Aborting!</string>
+ <string name="cancel_sideload">Cancelling ADB sideload...</string>
+ <string name="change_fs_err">Error changing file system.</string>
+ </resources>
+</language>
diff --git a/gui/devices/common/res/languages/es.xml b/gui/devices/common/res/languages/es.xml
new file mode 100644
index 0000000..ad5c54a
--- /dev/null
+++ b/gui/devices/common/res/languages/es.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Español</display>
+
+ <resources>
+ <resource name="font" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="mediumfont" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="filelist" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+ <string name="install_button_text">Instalar</string>
+ </resources>
+</language>
diff --git a/gui/devices/common/res/languages/fi.xml b/gui/devices/common/res/languages/fi.xml
new file mode 100644
index 0000000..0c4f5bc
--- /dev/null
+++ b/gui/devices/common/res/languages/fi.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Suomi</display>
+
+ <resources>
+ <resource name="font" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="mediumfont" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="filelist" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+ <string name="install_button_text">Asenna</string>
+ </resources>
+</language>
diff --git a/gui/gui.cpp b/gui/gui.cpp
index 31b61be..78e8a7e 100644
--- a/gui/gui.cpp
+++ b/gui/gui.cpp
@@ -517,13 +517,19 @@
fprintf(orsout, "%s", result);
LOGINFO("Command cannot be performed, operation in progress.\n");
} else {
- if (gui_console_only() == 0) {
+ if (strlen(command) == 11 && strncmp(command, "dumpstrings", 11) == 0) {
+ // This cannot be done safely with gui_console_only because gui_console_only updates mCurrentSet
+ // which makes the resources that we are trying to read unreachable.
+ gui_set_FILE(orsout);
+ PageManager::GetResources()->DumpStrings();
+ gui_set_FILE(NULL);
+ } else if (gui_console_only() == 0) {
LOGINFO("Console started successfully\n");
gui_set_FILE(orsout);
if (strlen(command) > 11 && strncmp(command, "runscript", 9) == 0) {
char* filename = command + 11;
if (OpenRecoveryScript::copy_script_file(filename) == 0) {
- LOGERR("Unable to copy script file\n");
+ LOGINFO("Unable to copy script file\n");
} else {
OpenRecoveryScript::run_script_file();
}
@@ -534,7 +540,7 @@
gui_print("%s = %s\n", varname, temp.c_str());
} else if (strlen(command) > 9 && strncmp(command, "decrypt", 7) == 0) {
char* pass = command + 8;
- gui_print("Attempting to decrypt data partition via command line.\n");
+ gui_msg("decrypt_cmd=Attempting to decrypt data partition via command line.");
if (PartitionManager.Decrypt_Device(pass) == 0) {
set_page_done = 1;
}
@@ -753,15 +759,39 @@
{
// This function parses text for DataManager values encompassed by %value% in the XML
// and string resources (%@resource_name%)
- size_t pos = 0;
+ size_t pos = 0, next, end;
while (1)
{
- size_t next = str.find('%', pos);
+ next = str.find("{@", pos);
+ if (next == std::string::npos)
+ break;
+
+ end = str.find('}', next + 1);
+ if (end == std::string::npos)
+ break;
+
+ std::string var = str.substr(next + 2, (end - next) - 2);
+ str.erase(next, (end - next) + 1);
+
+ size_t default_loc = var.find('=', 0);
+ std::string lookup;
+ if (default_loc == std::string::npos) {
+ str.insert(next, PageManager::GetResources()->FindString(var));
+ } else {
+ lookup = var.substr(0, default_loc);
+ std::string default_string = var.substr(default_loc + 1, var.size() - default_loc - 1);
+ str.insert(next, PageManager::GetResources()->FindString(lookup, default_string));
+ }
+ }
+ pos = 0;
+ while (1)
+ {
+ next = str.find('%', pos);
if (next == std::string::npos)
return str;
- size_t end = str.find('%', next + 1);
+ end = str.find('%', next + 1);
if (end == std::string::npos)
return str;
@@ -787,6 +817,10 @@
}
}
+std::string gui_lookup(const std::string& resource_name, const std::string& default_value) {
+ return PageManager::GetResources()->FindString(resource_name, default_value);
+}
+
extern "C" int gui_init(void)
{
gr_init();
@@ -828,7 +862,7 @@
{
if (PageManager::LoadPackage("TWRP", TWRES "ui.xml", "decrypt"))
{
- LOGERR("Failed to load base packages.\n");
+ gui_err("base_pkg_err=Failed to load base packages.");
goto error;
}
else
@@ -849,10 +883,9 @@
retry_count--;
}
- if (!PartitionManager.Mount_Settings_Storage(false))
+ if (!PartitionManager.Mount_Settings_Storage(true))
{
- LOGERR("Unable to mount %s during GUI startup.\n",
- theme_path.c_str());
+ LOGINFO("Unable to mount %s during GUI startup.\n", theme_path.c_str());
check = 1;
}
}
@@ -863,7 +896,7 @@
#endif // ifndef TW_OEM_BUILD
if (PageManager::LoadPackage("TWRP", TWRES "ui.xml", "main"))
{
- LOGERR("Failed to load base packages.\n");
+ gui_err("base_pkg_err=Failed to load base packages.");
goto error;
}
#ifndef TW_OEM_BUILD
@@ -886,7 +919,7 @@
{
#ifndef TW_OEM_BUILD
if (!PartitionManager.Mount_Settings_Storage(false)) {
- LOGERR("Unable to mount settings storage during GUI startup.\n");
+ LOGINFO("Unable to mount settings storage during GUI startup.\n");
return -1;
}
@@ -898,7 +931,7 @@
if (PageManager::ReloadPackage("TWRP", theme_path)) {
// Custom theme failed to load, try to load stock theme
if (PageManager::ReloadPackage("TWRP", TWRES "ui.xml")) {
- LOGERR("Failed to load base packages.\n");
+ gui_err("base_pkg_err=Failed to load base packages.");
goto error;
}
}
diff --git a/gui/gui.hpp b/gui/gui.hpp
new file mode 100644
index 0000000..afcd9b0
--- /dev/null
+++ b/gui/gui.hpp
@@ -0,0 +1,33 @@
+/*
+ Copyright 2015 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _GUI_HPP_HEADER
+#define _GUI_HPP_HEADER
+
+#include "twmsg.h"
+
+void gui_msg(const char* text);
+void gui_warn(const char* text);
+void gui_err(const char* text);
+void gui_highlight(const char* text);
+void gui_msg(Message msg);
+
+std::string gui_parse_text(std::string inText);
+std::string gui_lookup(const std::string& resource_name, const std::string& default_value);
+
+#endif //_GUI_HPP_HEADER
diff --git a/gui/listbox.cpp b/gui/listbox.cpp
index d2973bb..eeddff9 100644
--- a/gui/listbox.cpp
+++ b/gui/listbox.cpp
@@ -26,6 +26,9 @@
#include "rapidxml.hpp"
#include "objects.hpp"
#include "../data.hpp"
+#include "pages.hpp"
+
+extern std::vector<language_struct> Language_List;
GUIListBox::GUIListBox(xml_node<>* node) : GUIScrollList(node)
{
@@ -56,6 +59,21 @@
DataManager::SetValue(mVariable, attr->value());
// Get the currently selected value for the list
DataManager::GetValue(mVariable, currentValue);
+ if (mVariable == "tw_language") {
+ std::vector<language_struct>::iterator iter;
+ for (iter = Language_List.begin(); iter != Language_List.end(); iter++) {
+ ListItem data;
+ data.displayName = (*iter).displayvalue;
+ data.variableValue = (*iter).filename;
+ data.action = NULL;
+ if (currentValue == (*iter).filename) {
+ data.selected = 1;
+ DataManager::SetValue("tw_language_display", (*iter).displayvalue);
+ } else
+ data.selected = 0;
+ mListItems.push_back(data);
+ }
+ }
}
else
allowSelection = false; // allows using listbox as a read-only list or menu
diff --git a/gui/objects.hpp b/gui/objects.hpp
index 3d217c4..438905b 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -43,6 +43,15 @@
#define TW_Y_OFFSET 0
#endif
+struct translate_later_struct {
+ std::string resource_name; // Name of the string resource for looking up
+ std::string default_value; // Default in case we don't find the string resource
+ std::string color; // Color for the console... normal, highlight, warning, error
+ std::string format; // Formatted extra variables like %i, %s
+ std::string text; // Final, translated, formatted text
+ bool inline_format; // Indicates if the final text includes an inlined format variable
+};
+
class RenderObject
{
public:
@@ -356,6 +365,7 @@
int cancelbackup(std::string arg);
int checkpartitionlifetimewrites(std::string arg);
int mountsystemtoggle(std::string arg);
+ int setlanguage(std::string arg);
int simulate;
};
@@ -734,6 +744,7 @@
virtual size_t GetItemCount();
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
virtual void NotifySelect(size_t item_selected);
+ static void Translate_Now();
protected:
enum SlideoutState
{
diff --git a/gui/pages.cpp b/gui/pages.cpp
index 0511b1a..13f3bd7 100644
--- a/gui/pages.cpp
+++ b/gui/pages.cpp
@@ -33,6 +33,7 @@
#include <unistd.h>
#include <stdlib.h>
#include "../twrp-functions.hpp"
+#include "../partitions.hpp"
#include <string>
@@ -50,6 +51,14 @@
extern int gGuiRunning;
+// From ../twrp.cpp
+extern bool datamedia;
+
+// From console.cpp
+extern size_t last_message_count;
+extern std::vector<std::string> gConsole;
+extern std::vector<std::string> gConsoleColor;
+
std::map<std::string, PageSet*> PageManager::mPageSets;
PageSet* PageManager::mCurrentSet;
PageSet* PageManager::mBaseSet = NULL;
@@ -57,6 +66,7 @@
HardwareKeyboard *PageManager::mHardwareKeyboard = NULL;
bool PageManager::mReloadTheme = false;
std::string PageManager::mStartPage = "main";
+std::vector<language_struct> Language_List;
int tw_x_offset = 0;
int tw_y_offset = 0;
@@ -670,7 +680,48 @@
delete mResources;
}
-int PageSet::Load(ZipArchive* package, char* xmlFile)
+int PageSet::LoadLanguage(char* languageFile, ZipArchive* package)
+{
+ xml_document<> lang;
+ xml_node<>* parent;
+ xml_node<>* child;
+ std::string resource_source;
+
+ if (languageFile) {
+ printf("parsing languageFile\n");
+ lang.parse<0>(languageFile);
+ printf("parsing languageFile done\n");
+ } else {
+ return -1;
+ }
+
+ parent = lang.first_node("language");
+ if (!parent) {
+ LOGERR("Unable to locate language node in language file.\n");
+ lang.clear();
+ return -1;
+ }
+
+ child = parent->first_node("display");
+ if (child) {
+ DataManager::SetValue("tw_language_display", child->value());
+ resource_source = child->value();
+ } else {
+ LOGERR("language file does not have a display value set\n");
+ DataManager::SetValue("tw_language_display", "Not Set");
+ resource_source = languageFile;
+ }
+
+ child = parent->first_node("resources");
+ if (child)
+ mResources->LoadResources(child, package, resource_source);
+ else
+ return -1;
+ lang.clear();
+ return 0;
+}
+
+int PageSet::Load(ZipArchive* package, char* xmlFile, char* languageFile)
{
xml_document<> mDoc;
xml_node<>* parent;
@@ -735,10 +786,14 @@
} else {
LOGINFO("XML contains no details tag, no scaling will be applied.\n");
}
+
+ if (languageFile)
+ LoadLanguage(languageFile, package);
+
LOGINFO("Loading resources...\n");
child = parent->first_node("resources");
if (child)
- mResources->LoadResources(child, package);
+ mResources->LoadResources(child, package, "theme");
LOGINFO("Loading variables...\n");
child = parent->first_node("variables");
@@ -831,7 +886,7 @@
LOGINFO("Loading included resources...\n");
child = parent->first_node("resources");
if (child)
- mResources->LoadResources(child, package);
+ mResources->LoadResources(child, package, "theme");
LOGINFO("Loading included variables...\n");
child = parent->first_node("variables");
@@ -1121,6 +1176,11 @@
return (mCurrentPage ? mCurrentPage->NotifyVarChange(varName, value) : -1);
}
+void PageSet::AddStringResource(std::string resource_source, std::string resource_name, std::string value)
+{
+ mResources->AddStringResource(resource_source, resource_name, value);
+}
+
char* PageManager::LoadFileToBuffer(std::string filename, ZipArchive* package) {
size_t len;
char* buffer = NULL;
@@ -1181,12 +1241,96 @@
return buffer;
}
+void PageManager::LoadLanguageListDir(string dir) {
+ if (!TWFunc::Path_Exists(dir)) {
+ LOGERR("LoadLanguageListDir '%s' path not found\n", dir.c_str());
+ return;
+ }
+
+ DIR *d = opendir(dir.c_str());
+ struct dirent *p;
+
+ if (d == NULL) {
+ LOGERR("LoadLanguageListDir error opening dir: '%s', %s\n", dir.c_str(), strerror(errno));
+ return;
+ }
+
+ while ((p = readdir(d))) {
+ if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, "..") || strlen(p->d_name) < 5)
+ continue;
+
+ string file = p->d_name;
+ if (file.substr(strlen(p->d_name) - 4) != ".xml")
+ continue;
+ string path = dir + p->d_name;
+ string file_no_extn = file.substr(0, strlen(p->d_name) - 4);
+ struct language_struct language_entry;
+ language_entry.filename = file_no_extn;
+ char* xmlFile = PageManager::LoadFileToBuffer(dir + p->d_name, NULL);
+ if (xmlFile == NULL) {
+ LOGERR("LoadLanguageListDir unable to load '%s'\n", language_entry.filename.c_str());
+ continue;
+ }
+ xml_document<> *doc = new xml_document<>();
+ doc->parse<0>(xmlFile);
+
+ xml_node<>* parent = doc->first_node("language");
+ if (!parent) {
+ LOGERR("Invalid language XML file '%s'\n", language_entry.filename.c_str());
+ } else {
+ xml_node<>* child = parent->first_node("display");
+ if (child) {
+ language_entry.displayvalue = child->value();
+ } else {
+ LOGERR("No display value for '%s'\n", language_entry.filename.c_str());
+ language_entry.displayvalue = language_entry.filename;
+ }
+ Language_List.push_back(language_entry);
+ }
+ doc->clear();
+ delete doc;
+ free(xmlFile);
+ }
+ closedir(d);
+}
+
+void PageManager::LoadLanguageList(ZipArchive* package) {
+ Language_List.clear();
+ if (TWFunc::Path_Exists(TWRES "customlanguages"))
+ TWFunc::removeDir(TWRES "customlanguages", true);
+ if (package) {
+ TWFunc::Recursive_Mkdir(TWRES "customlanguages");
+ struct utimbuf timestamp = { 1217592000, 1217592000 }; // 8/1/2008 default
+ mzExtractRecursive(package, "languages", TWRES "customlanguages/", ×tamp, NULL, NULL, NULL);
+ LoadLanguageListDir(TWRES "customlanguages/");
+ } else {
+ LoadLanguageListDir(TWRES "languages/");
+ }
+}
+
+void PageManager::LoadLanguage(string filename) {
+ string actual_filename;
+ if (TWFunc::Path_Exists(TWRES "customlanguages/" + filename + ".xml"))
+ actual_filename = TWRES "customlanguages/" + filename + ".xml";
+ else
+ actual_filename = TWRES "languages/" + filename + ".xml";
+ char* xmlFile = PageManager::LoadFileToBuffer(actual_filename, NULL);
+ if (xmlFile == NULL)
+ LOGERR("Unable to load '%s'\n", actual_filename.c_str());
+ else {
+ mCurrentSet->LoadLanguage(xmlFile, NULL);
+ free(xmlFile);
+ }
+ PartitionManager.Translate_Partition_Display_Names();
+}
+
int PageManager::LoadPackage(std::string name, std::string package, std::string startpage)
{
int fd;
ZipArchive zip, *pZip = NULL;
long len;
char* xmlFile = NULL;
+ char* languageFile = NULL;
PageSet* pageSet = NULL;
int ret;
MemMapping map;
@@ -1201,6 +1345,8 @@
LOGINFO("Load XML directly\n");
tw_x_offset = TW_X_OFFSET;
tw_y_offset = TW_Y_OFFSET;
+ LoadLanguageList(NULL);
+ languageFile = LoadFileToBuffer(TWRES "languages/en.xml", NULL);
}
else
{
@@ -1220,6 +1366,8 @@
}
pZip = &zip;
package = "ui.xml";
+ LoadLanguageList(pZip);
+ languageFile = LoadFileToBuffer("languages/en.xml", pZip);
}
xmlFile = LoadFileToBuffer(package, pZip);
@@ -1230,8 +1378,11 @@
// Before loading, mCurrentSet must be the loading package so we can find resources
pageSet = mCurrentSet;
mCurrentSet = new PageSet(xmlFile);
-
- ret = mCurrentSet->Load(pZip, xmlFile);
+ ret = mCurrentSet->Load(pZip, xmlFile, languageFile);
+ if (languageFile) {
+ free(languageFile);
+ languageFile = NULL;
+ }
if (ret == 0)
{
mCurrentSet->SetPage(startpage);
@@ -1253,6 +1404,8 @@
sysReleaseMap(&map);
}
free(xmlFile);
+ if (languageFile)
+ free(languageFile);
return ret;
error:
@@ -1313,7 +1466,7 @@
if (LoadPackage(name, package, mStartPage) != 0)
{
- LOGERR("Failed to load package '%s'.\n", package.c_str());
+ LOGINFO("Failed to load package '%s'.\n", package.c_str());
mPageSets.insert(std::pair<std::string, PageSet*>(name, set));
return -1;
}
@@ -1322,6 +1475,7 @@
if (mBaseSet == set)
mBaseSet = mCurrentSet;
delete set;
+ GUIConsole::Translate_Now();
return 0;
}
@@ -1364,6 +1518,18 @@
ret_val = 1;
}
}
+ if (ret_val == 0) {
+ if (DataManager::GetStrValue("tw_language") != "en.xml") {
+ LOGINFO("Loading language '%s'\n", DataManager::GetStrValue("tw_language").c_str());
+ LoadLanguage(DataManager::GetStrValue("tw_language"));
+ }
+ }
+
+ // This makes the console re-translate
+ last_message_count = 0;
+ gConsole.clear();
+ gConsoleColor.clear();
+
return ret_val;
}
@@ -1511,6 +1677,12 @@
return (mCurrentSet ? mCurrentSet->NotifyVarChange(varName, value) : -1);
}
+void PageManager::AddStringResource(std::string resource_source, std::string resource_name, std::string value)
+{
+ if (mCurrentSet)
+ mCurrentSet->AddStringResource(resource_source, resource_name, value);
+}
+
extern "C" void gui_notifyVarChange(const char *name, const char* value)
{
if (!gGuiRunning)
diff --git a/gui/pages.hpp b/gui/pages.hpp
index 018c2ca..5dcc9e0 100644
--- a/gui/pages.hpp
+++ b/gui/pages.hpp
@@ -6,7 +6,9 @@
#include "../minzip/Zip.h"
#include <vector>
#include <map>
+#include <string>
#include "rapidxml.hpp"
+#include "gui.hpp"
using namespace rapidxml;
enum TOUCH_STATE {
@@ -27,12 +29,18 @@
: red(r), green(g), blue(b), alpha(a) {}
};
+struct language_struct {
+ std::string filename;
+ std::string displayvalue;
+};
+
+extern std::vector<language_struct> Language_List;
+
// Utility Functions
int ConvertStrToColor(std::string str, COLOR* color);
int gui_forceRender(void);
int gui_changePage(std::string newPage);
int gui_changeOverlay(std::string newPage);
-std::string gui_parse_text(string inText);
class Resource;
class ResourceManager;
@@ -82,7 +90,8 @@
virtual ~PageSet();
public:
- int Load(ZipArchive* package, char* xmlFile);
+ int LoadLanguage(char* languageFile, ZipArchive* package);
+ int Load(ZipArchive* package, char* xmlFile, char* languageFile);
int CheckInclude(ZipArchive* package, xml_document<> *parentDoc);
Page* FindPage(std::string name);
@@ -103,6 +112,7 @@
int NotifyVarChange(std::string varName, std::string value);
std::vector<xml_node<>*> styles;
+ void AddStringResource(std::string resource_source, std::string resource_name, std::string value);
protected:
int LoadPages(xml_node<>* pages);
@@ -121,6 +131,8 @@
public:
// Used by GUI
static char* LoadFileToBuffer(std::string filename, ZipArchive* package);
+ static void LoadLanguageList(ZipArchive* package);
+ static void LoadLanguage(std::string filename);
static int LoadPackage(std::string name, std::string package, std::string startpage);
static PageSet* SelectPackage(std::string name);
static int ReloadPackage(std::string name, std::string package);
@@ -155,9 +167,14 @@
static HardwareKeyboard *GetHardwareKeyboard();
static xml_node<>* FindStyle(std::string name);
+ static void AddStringResource(std::string resource_source, std::string resource_name, std::string value);
protected:
static PageSet* FindPackage(std::string name);
+ static void LoadLanguageListDir(std::string dir);
+ static void Translate_Partition(const char* path, const char* resource_name, const char* default_value);
+ static void Translate_Partition(const char* path, const char* resource_name, const char* default_value, const char* storage_resource_name, const char* storage_default_value);
+ static void Translate_Partition_Display_Names();
protected:
static std::map<std::string, PageSet*> mPageSets;
diff --git a/gui/resources.cpp b/gui/resources.cpp
index 253d438..a8f4199 100644
--- a/gui/resources.cpp
+++ b/gui/resources.cpp
@@ -100,6 +100,13 @@
FontResource::FontResource(xml_node<>* node, ZipArchive* pZip)
: Resource(node, pZip)
{
+ origFontSize = 0;
+ origFont = NULL;
+ LoadFont(node, pZip);
+}
+
+void FontResource::LoadFont(xml_node<>* node, ZipArchive* pZip)
+{
std::string file;
xml_attribute<>* attr;
@@ -116,12 +123,21 @@
if(file.size() >= 4 && file.compare(file.size()-4, 4, ".ttf") == 0)
{
m_type = TYPE_TTF;
+ int font_size = 0;
- attr = node->first_attribute("size");
- if(!attr)
- return;
+ if (origFontSize != 0) {
+ attr = node->first_attribute("scale");
+ if (attr == NULL)
+ return;
+ font_size = origFontSize * atoi(attr->value()) / 100;
+ } else {
+ attr = node->first_attribute("size");
+ if (attr == NULL)
+ return;
+ font_size = scale_theme_min(atoi(attr->value()));
+ origFontSize = font_size;
+ }
- int size = scale_theme_min(atoi(attr->value()));
int dpi = 300;
attr = node->first_attribute("dpi");
@@ -130,13 +146,13 @@
if (ExtractResource(pZip, "fonts", file, "", TMP_RESOURCE_NAME) == 0)
{
- mFont = gr_ttf_loadFont(TMP_RESOURCE_NAME, size, dpi);
+ mFont = gr_ttf_loadFont(TMP_RESOURCE_NAME, font_size, dpi);
unlink(TMP_RESOURCE_NAME);
}
else
{
file = std::string(TWRES "fonts/") + file;
- mFont = gr_ttf_loadFont(file.c_str(), size, dpi);
+ mFont = gr_ttf_loadFont(file.c_str(), font_size, dpi);
}
}
else
@@ -145,13 +161,28 @@
}
}
+void FontResource::DeleteFont() {
+ if(mFont)
+ gr_ttf_freeFont(mFont);
+ mFont = NULL;
+ if(origFont)
+ gr_ttf_freeFont(origFont);
+ origFont = NULL;
+}
+
+void FontResource::Override(xml_node<>* node, ZipArchive* pZip) {
+ if (!origFont) {
+ origFont = mFont;
+ } else if (mFont) {
+ gr_ttf_freeFont(mFont);
+ mFont = NULL;
+ }
+ LoadFont(node, pZip);
+}
+
FontResource::~FontResource()
{
- if(mFont)
- {
- if(m_type == TYPE_TTF)
- gr_ttf_freeFont(mFont);
- }
+ DeleteFont();
}
ImageResource::ImageResource(xml_node<>* node, ZipArchive* pZip)
@@ -255,17 +286,58 @@
std::string ResourceManager::FindString(const std::string& name) const
{
- std::map<std::string, std::string>::const_iterator it = mStrings.find(name);
- if (it != mStrings.end())
- return it->second;
+ if (this != NULL) {
+ std::map<std::string, string_resource_struct>::const_iterator it = mStrings.find(name);
+ if (it != mStrings.end())
+ return it->second.value;
+ LOGERR("String resource '%s' not found. No default value.\n", name.c_str());
+ PageManager::AddStringResource("NO DEFAULT", name, "[" + name + ("]"));
+ } else {
+ LOGINFO("String resources not loaded when looking for '%s'. No default value.\n", name.c_str());
+ }
return "[" + name + ("]");
}
+std::string ResourceManager::FindString(const std::string& name, const std::string& default_string) const
+{
+ if (this != NULL) {
+ std::map<std::string, string_resource_struct>::const_iterator it = mStrings.find(name);
+ if (it != mStrings.end())
+ return it->second.value;
+ LOGERR("String resource '%s' not found. Using default value.\n", name.c_str());
+ PageManager::AddStringResource("DEFAULT", name, default_string);
+ } else {
+ LOGINFO("String resources not loaded when looking for '%s'. Using default value.\n", name.c_str());
+ }
+ return default_string;
+}
+
+void ResourceManager::DumpStrings() const
+{
+ if (this == NULL) {
+ gui_print("No string resources\n");
+ return;
+ }
+ std::map<std::string, string_resource_struct>::const_iterator it;
+ gui_print("Dumping all strings:\n");
+ for (it = mStrings.begin(); it != mStrings.end(); it++)
+ gui_print("source: %s: '%s' = '%s'\n", it->second.source.c_str(), it->first.c_str(), it->second.value.c_str());
+ gui_print("Done dumping strings\n");
+}
+
ResourceManager::ResourceManager()
{
}
-void ResourceManager::LoadResources(xml_node<>* resList, ZipArchive* pZip)
+void ResourceManager::AddStringResource(std::string resource_source, std::string resource_name, std::string value)
+{
+ string_resource_struct res;
+ res.source = resource_source;
+ res.value = value;
+ mStrings[resource_name] = res;
+}
+
+void ResourceManager::LoadResources(xml_node<>* resList, ZipArchive* pZip, std::string resource_source)
{
if (!resList)
return;
@@ -290,6 +362,26 @@
delete res;
}
}
+ else if (type == "fontoverride")
+ {
+ if (mFonts.size() != 0 && child && child->first_attribute("name")) {
+ string FontName = child->first_attribute("name")->value();
+ size_t font_count = mFonts.size(), i;
+ bool found = false;
+
+ for (i = 0; i < font_count; i++) {
+ if (mFonts[i]->GetName() == FontName) {
+ mFonts[i]->Override(child, pZip);
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ LOGERR("Unable to locate font '%s' for override.\n", FontName.c_str());
+ }
+ } else if (mFonts.size() != 0)
+ LOGERR("Unable to locate font name for type fontoverride.\n");
+ }
else if (type == "image")
{
ImageResource* res = new ImageResource(child, pZip);
@@ -312,9 +404,12 @@
}
else if (type == "string")
{
- if (xml_attribute<>* attr = child->first_attribute("name"))
- mStrings[attr->value()] = child->value();
- else
+ if (xml_attribute<>* attr = child->first_attribute("name")) {
+ string_resource_struct res;
+ res.source = resource_source;
+ res.value = child->value();
+ mStrings[attr->value()] = res;
+ } else
error = true;
}
else
diff --git a/gui/resources.hpp b/gui/resources.hpp
index 0eb3267..ce06d96 100644
--- a/gui/resources.hpp
+++ b/gui/resources.hpp
@@ -6,6 +6,7 @@
#include <string>
#include <vector>
#include <map>
+#include "rapidxml.hpp"
struct ZipArchive;
@@ -49,10 +50,19 @@
public:
void* GetResource() { return this ? mFont : NULL; }
int GetHeight() { return gr_getMaxFontHeight(this ? mFont : NULL); }
+ void Override(xml_node<>* node, ZipArchive* pZip);
protected:
void* mFont;
Type m_type;
+
+private:
+ void LoadFont(xml_node<>* node, ZipArchive* pZip);
+ void DeleteFont();
+
+private:
+ int origFontSize;
+ void* origFont;
};
class ImageResource : public Resource
@@ -92,19 +102,26 @@
public:
ResourceManager();
virtual ~ResourceManager();
- void LoadResources(xml_node<>* resList, ZipArchive* pZip);
+ void AddStringResource(std::string resource_source, std::string resource_name, std::string value);
+ void LoadResources(xml_node<>* resList, ZipArchive* pZip, std::string resource_source);
public:
FontResource* FindFont(const std::string& name) const;
ImageResource* FindImage(const std::string& name) const;
AnimationResource* FindAnimation(const std::string& name) const;
std::string FindString(const std::string& name) const;
+ std::string FindString(const std::string& name, const std::string& default_string) const;
+ void DumpStrings() const;
private:
+ struct string_resource_struct {
+ std::string value;
+ std::string source;
+ };
std::vector<FontResource*> mFonts;
std::vector<ImageResource*> mImages;
std::vector<AnimationResource*> mAnimations;
- std::map<std::string, std::string> mStrings;
+ std::map<std::string, string_resource_struct> mStrings;
};
#endif // _RESOURCE_HEADER
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
old mode 100644
new mode 100755
index a6b38a2..938c854
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -193,7 +193,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Team Win Recovery Project</text>
+ <text>{@twrp_header=Team Win Recovery Project}</text>
</text>
<text style="text_m">
@@ -204,7 +204,7 @@
<button style="main_button">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Install</text>
+ <text>{@install_btn=Install}</text>
<actions>
<action function="queueclear"/>
<action function="set">tw_selectimage=0</action>
@@ -214,43 +214,43 @@
<button style="main_button">
<placement x="%center_x%" y="%row2_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_btn=Wipe}</text>
<action function="page">wipe</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row6a_y%"/>
- <text>Backup</text>
+ <text>{@backup_btn=Backup}</text>
<action function="page">backup</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row6a_y%"/>
- <text>Restore</text>
+ <text>{@restore_btn=Restore}</text>
<action function="page">restore</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Mount</text>
+ <text>{@mount_btn=Mount}</text>
<action function="page">mount</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row11_y%"/>
- <text>Settings</text>
+ <text>{@settings_btn=Settings}</text>
<action function="page">settings</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_btn=Advanced}</text>
<action function="page">advanced</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row15a_y%"/>
- <text>Reboot</text>
+ <text>{@reboot_btn=Reboot}</text>
<action function="page">reboot</action>
</button>
</page>
@@ -261,25 +261,25 @@
<text style="text_l">
<condition var1="tw_selectimage" var2="0"/>
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_hdr=Install Zip}</text>
</text>
<text style="text_l">
<condition var1="tw_selectimage" var2="1"/>
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Image</text>
+ <text>{@install_image_hdr=Install Image}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@select_file_from_storage=Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="sort_options"/>
<fileselector>
<placement x="%col1_x_left%" y="%row1a_y%" w="%fileselector_install_folder_width%" h="%fileselector_install_height%"/>
- <text>Folders</text>
+ <text>{@file_selector_folders_hdr=Folders}</text>
<filter folders="1" files="0"/>
<path name="tw_zip_location" default="/sdcard"/>
<data name="select"/>
@@ -308,7 +308,7 @@
<button style="main_button_half_width_low">
<condition var1="tw_selectimage" var2="0"/>
<placement x="%col_button_right%" y="%row13a_y%"/>
- <text>Install Image</text>
+ <text>{@install_image_btn=Install Image}</text>
<actions>
<action function="set">tw_selectimage=1</action>
<action function="page">install</action>
@@ -318,7 +318,7 @@
<button style="main_button_half_width_low">
<condition var1="tw_selectimage" var2="1"/>
<placement x="%col_button_right%" y="%row13a_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_btn=Install Zip}</text>
<actions>
<action function="set">tw_selectimage=0</action>
<action function="page">install</action>
@@ -327,7 +327,7 @@
<button style="main_button_half_width_low">
<placement x="%col_button_right%" y="%row16a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=install</action>
<action function="overlay">select_storage</action>
@@ -369,32 +369,32 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_hdr=Install Zip}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>%tw_zip_queue_count% of max of 10 Files queued</text>
+ <text>{@zip_queue_count=%tw_zip_queue_count% of max of 10 Files queued}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>This operation may install incompatible</text>
+ <text>{@zip_warn1=This operation may install incompatible}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>software and render your device unusable.</text>
+ <text>{@zip_warn2=software and render your device unusable.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Press back to cancel adding this zip.</text>
+ <text>{@zip_back_cancel=Press back to cancel adding this zip.}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row8_y%"/>
- <text>Folder:</text>
+ <text>{@folder=Folder:}</text>
</text>
<text style="text_m">
@@ -404,7 +404,7 @@
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>File:</text>
+ <text>{@file=File:}</text>
</text>
<text style="text_m">
@@ -414,31 +414,31 @@
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row8_y%"/>
- <text>Options:</text>
+ <text>{@options=Options:}</text>
</text>
<checkbox>
<placement x="%col1_x_right%" y="%row9_y%"/>
- <text>Zip file signature verification</text>
+ <text>{@zip_sig_chk=Zip signature verification}</text>
<data variable="tw_signed_zip_verify"/>
</checkbox>
<checkbox>
<condition var1="tw_has_injecttwrp" var2="1"/>
<placement x="%col1_x_right%" y="%row10a_y%"/>
- <text>Inject TWRP after install</text>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
<data variable="tw_inject_after_zip"/>
</checkbox>
<button style="main_button_half_width">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Add more Zips</text>
+ <text>{@zip_add_btn=Add more Zips}</text>
<action function="page">install</action>
</button>
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Clear Zip Queue</text>
+ <text>{@zip_clear_btn=Clear Zip Queue}</text>
<actions>
<action function="queueclear"/>
<action function="page">install</action>
@@ -446,7 +446,7 @@
</button>
<slider>
- <text>Swipe to confirm Flash</text>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
<action function="flash">flash_zip</action>
</slider>
@@ -469,7 +469,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip %tw_zip_index% of %tw_zip_queue_count%</text>
+ <text>{@install_zip_count_hdr=Install Zip %tw_zip_index% of %tw_zip_queue_count%}</text>
</text>
<text style="text_m">
@@ -492,26 +492,26 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_hdr=Install Zip}</text>
</text>
<text style="text_m_fail">
<condition var1="tw_operation_status" op="!=" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Failed</text>
+ <text>{@failed=Failed}</text>
</text>
<text style="text_m">
<condition var1="tw_operation_status" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Successful</text>
+ <text>{@successful=Successful}</text>
</text>
<template name="console"/>
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Wipe cache/dalvik</text>
+ <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
<actions>
<action function="set">tw_back=flash_done</action>
<action function="set">tw_action=wipe</action>
@@ -519,30 +519,30 @@
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=wipe</action>
<action function="set">tw_action2_param=dalvik</action>
- <action function="set">tw_text1=Wipe Cache & Dalvik?</action>
- <action function="set">tw_action_text1=Wiping Cache & Dalvik...</action>
- <action function="set">tw_complete_text1=Cache & Dalvik Wipe Complete</action>
- <action function="set">tw_slider_text=Swipe to Wipe</action>
+ <action function="set">tw_text1={@wipe_cache_dalvik_confirm=Wipe Cache & Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Cache & Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_cache_dalvik_complete=Cache & Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_half_width">
<placement x="%center_x%" y="%row15a_y%"/>
- <text>Reboot System</text>
+ <text>{@reboot_system_btn=Reboot System}</text>
<actions>
<action function="set">tw_back=main2</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
<action function="set">tw_text3=</action>
<action function="set">tw_text4=</action>
- <action function="set">tw_action_text1=Rebooting...</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -569,32 +569,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Image</text>
+ <text>{@install_image_hdr=Install Image}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select Target Partition</text>
- </text>
-
- <text style="text_m_accent">
- <placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>This operation may install incompatible</text>
- </text>
-
- <text style="text_m_accent">
- <placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>software and render your device unusable.</text>
- </text>
-
- <text style="text_m">
- <placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Press back to cancel adding this image.</text>
+ <text>{@install_sel_target=Select Target Partition}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row8_y%"/>
- <text>Folder:</text>
+ <text>{@folder=Folder:}</text>
</text>
<text style="text_m">
@@ -604,7 +589,7 @@
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>File:</text>
+ <text>{@file=File:}</text>
</text>
<text style="text_m">
@@ -615,20 +600,20 @@
<partitionlist>
<placement x="%col1_x_right%" y="%row7a_y%" w="%content_half_width%" h="%partitionlist_flashimage_height%"/>
<icon selected="radio_true" unselected="radio_false"/>
- <text>Select Partition to Flash Image:</text>
+ <text>{@flash_image_select=Select Partition to Flash Image:}</text>
<data name="tw_flash_partition"/>
<listtype name="flashimg"/>
</partitionlist>
<slider>
- <text>Swipe to confirm Flash</text>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
<actions>
<action function="set">tw_back=flashimage_confirm</action>
<action function="set">tw_action=flashimage</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_action_text1=Flashing Image...</action>
+ <action function="set">tw_action_text1={@flashing_image=Flashing Image...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Image Flashed</action>
+ <action function="set">tw_complete_text1={@image_flashed=Image Flashed}</action>
<action function="page">action_page</action>
</actions>
<action function="flashimage"/>
@@ -678,7 +663,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Confirm Action</text>
+ <text>{@confirm_action=Confirm Action}</text>
</text>
<text style="text_m">
@@ -708,7 +693,7 @@
<text style="text_m">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<slider style="slider_centered">
@@ -750,7 +735,7 @@
<button style="main_button_half_width">
<condition var1="tw_has_cancel" var2="1"/>
<placement x="%col2_x_right%" y="%row15a_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="%tw_cancel_action%">%tw_cancel_param%</action>
</button>
@@ -828,20 +813,20 @@
<text style="text_m_fail">
<condition var1="tw_operation_status" op="!=" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Failed</text>
+ <text>{@failed=Failed}</text>
</text>
<text style="text_m">
<condition var1="tw_operation_status" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Successful</text>
+ <text>{@successful=Successful}</text>
</text>
<template name="console"/>
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Back</text>
+ <text>{@back_btn=Back}</text>
<actions>
<action function="set">tw_clear_destination=%tw_back%</action>
<action function="page">clear_vars</action>
@@ -850,20 +835,20 @@
<button style="main_button_half_width">
<placement x="%center_x%" y="%row15a_y%"/>
- <text>Reboot System</text>
+ <text>{@reboot_system_btn=Reboot System}</text>
<actions>
<action function="set">tw_back=main2</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
<action function="set">tw_text3=</action>
<action function="set">tw_text4=</action>
- <action function="set">tw_action_text1=Rebooting...</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -930,23 +915,23 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Factory Reset</text>
+ <text>{@factory_reset_hdr=Factory Reset}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Wipes Data, Cache, and Dalvik</text>
+ <text>{@factory_reset1=Wipes Data, Cache, and Dalvik}</text>
</text>
<text style="text_m_accent">
<condition var1="tw_has_data_media" var2="1"/>
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>(not including internal storage)</text>
+ <text>{@factory_reset2=(not including internal storage)}</text>
</text>
<text style="text_m_accent">
@@ -955,33 +940,33 @@
<condition var1="fileexists" var2="/and-sec"/>
</conditions>
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Android Secure</text>
+ <text>{@android_secure=Android Secure}</text>
</text>
<text style="text_m_accent">
<condition var1="tw_has_sdext_partition" var2="1"/>
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>SD-EXT</text>
+ <text>{@sdext=SD-EXT}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>Most of the time this is</text>
+ <text>{@factory_reset3=Most of the time this is}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>the only wipe that you need.</text>
+ <text>{@factory_reset4=the only wipe that you need.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row10_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<button style="main_button_half_width">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Advanced Wipe</text>
+ <text>{@advanced_wipe_btn=Advanced Wipe}</text>
<actions>
<action function="set">partitionlisterror=0</action>
<action function="page">advancedwipe</action>
@@ -991,7 +976,7 @@
<button style="main_button_half_width">
<condition var1="tw_has_data_media" var2="1"/>
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Format Data</text>
+ <text>{@format_data_btn=Format Data}</text>
<action function="page">formatdata</action>
</button>
@@ -1001,29 +986,29 @@
<condition var1="tw_has_data_media" var2="0"/>
</conditions>
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Wipe Encryption</text>
+ <text>{@wipe_enc_btn=Wipe Encryption}</text>
<actions>
<action function="set">tw_back=wipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=DATAMEDIA</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Wipe Encryption from Data?</action>
+ <action function="set">tw_text1={@wipe_enc_confirm=Wipe Encryption from Data?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting Data...</action>
- <action function="set">tw_complete_text1=Data Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Format Data</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_format_data=Swipe to Format Data}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<slider>
- <text>Swipe to Factory Reset</text>
+ <text>{@swipe_factory_reset=Swipe to Factory Reset}</text>
<actions>
<action function="set">tw_back=wipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=data</action>
- <action function="set">tw_action_text1=Factory Reset...</action>
- <action function="set">tw_complete_text1=Factory Reset Complete</action>
+ <action function="set">tw_action_text1={@factory_resetting=Factory Reset...}</action>
+ <action function="set">tw_complete_text1={@factory_reset_complete=Factory Reset Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -1048,17 +1033,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Advanced Wipe</text>
+ <text>{@advanced_wipe_hdr=Advanced Wipe}</text>
</text>
<partitionlist>
<placement x="%col1_x_left%" y="%row1a_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
- <text>Select Partitions to Wipe:</text>
+ <text>{@sel_part_wipe=Select Partitions to Wipe:}</text>
<data name="tw_wipe_list"/>
<listtype name="wipe"/>
</partitionlist>
@@ -1066,12 +1051,12 @@
<text style="text_m_fail">
<condition var1="partitionlisterror" var2="1"/>
<placement x="%col2_x_left%" y="%row14a_y%" placement="5"/>
- <text>Invalid partition selection</text>
+ <text>{@invalid_part_sel=Invalid partition selection}</text>
</text>
<button style="main_button_m">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Repair or Change File System</text>
+ <text>{@repair_change_btn=Repair or Change File System}</text>
<actions>
<action function="checkpartitionlist"/>
<action function="page">checkpartitionlist</action>
@@ -1079,14 +1064,14 @@
</button>
<slider>
- <text>Swipe to Wipe</text>
+ <text>{@swipe_wipe=Swipe to Wipe}</text>
<actions>
<action function="set">tw_back=advancedwipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=LIST</action>
- <action function="set">tw_text1=Wipe Selected Partition(s)?</action>
- <action function="set">tw_action_text1=Wiping Partition(s)...</action>
- <action function="set">tw_complete_text1=Wipe Complete</action>
+ <action function="set">tw_text1={@wipe_sel_confirm=Wipe Selected Partition(s)?}</action>
+ <action function="set">tw_action_text1={@wiping_part=Wiping Partition(s)...}</action>
+ <action function="set">tw_complete_text1={@wipe_complete=Wipe Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -1107,32 +1092,32 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Format Data</text>
+ <text>{@format_data_hdr=Format Data}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Format Data will wipe all of your apps, backups, pictures, videos, media, and</text>
+ <text>{@format_data_lcp1=Format Data will wipe all of your apps, backups, pictures, videos, media, and}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>removes encryption on internal storage.</text>
+ <text>{@format_data_lcp2=removes encryption on internal storage.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>This cannot be undone. Press back to cancel.</text>
+ <text>{@format_data_undo=This cannot be undone.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>Type yes to continue.</text>
+ <text>{@yes_continue=Type yes to continue. Press back to cancel.}</text>
</text>
<input>
@@ -1167,8 +1152,8 @@
<action function="set">tw_back=formatdata</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=DATAMEDIA</action>
- <action function="set">tw_action_text1=Formatting Data...</action>
- <action function="set">tw_complete_text1=Data Format Complete</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
<action function="page">action_page</action>
</actions>
</action>
@@ -1204,83 +1189,83 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Partition Options for: %tw_partition_name%</text>
+ <text>{@part_opt_hdr=Partition Options for: %tw_partition_name%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Mount Point: %tw_partition_mount_point%</text>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>Current file system: %tw_partition_file_system%</text>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_is_present" var2="1"/>
<placement x="%col2_x_left%" y="%row5_y%"/>
- <text>Present: Yes</text>
+ <text>{@part_present_yes=Present: Yes}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_is_present" var2="0"/>
<placement x="%col2_x_left%" y="%row5_y%"/>
- <text>Present: No</text>
+ <text>{@part_present_no=Present: No}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_removable" var2="1"/>
<placement x="%col1_x_right%" y="%row5_y%"/>
- <text>Removable: Yes</text>
+ <text>{@part_removable_yes=Removable: Yes}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_removable" var2="0"/>
<placement x="%col1_x_right%" y="%row5_y%"/>
- <text>Removable: No</text>
+ <text>{@part_removable_no=Removable: No}</text>
</text>
<text style="text_m">
<placement x="%col2_x_left%" y="%row7_y%"/>
- <text>Size: %tw_partition_size%MB</text>
+ <text>{@part_size=Size: %tw_partition_size%MB}</text>
</text>
<text style="text_m">
<placement x="%col1_x_right%" y="%row7_y%"/>
- <text>Used: %tw_partition_used%MB</text>
+ <text>{@part_used=Used: %tw_partition_used%MB}</text>
</text>
<text style="text_m">
<placement x="%col2_x_left%" y="%row9_y%"/>
- <text>Free: %tw_partition_free%MB</text>
+ <text>{@part_free=Free: %tw_partition_free%MB}</text>
</text>
<text style="text_m">
<placement x="%col1_x_right%" y="%row9_y%"/>
- <text>Backup Size: %tw_partition_backup_size%MB</text>
+ <text>{@part_backup_size=Backup Size: %tw_partition_backup_size%MB}</text>
</text>
<button style="main_button_half_width">
<condition var1="tw_partition_can_resize" op="=" var2="1"/>
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Resize File System</text>
+ <text>{@resize_btn=Resize File System}</text>
<actions>
<action function="set">tw_back=partitionoptions</action>
<action function="set">tw_action=resize</action>
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=getpartitiondetails</action>
- <action function="set">tw_text1=Resize %tw_partition_name%?</action>
+ <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Resizing...</action>
- <action function="set">tw_complete_text1=Resize Complete</action>
- <action function="set">tw_slider_text=Swipe to Resize</action>
+ <action function="set">tw_action_text1={@resizing=Resizing...}</action>
+ <action function="set">tw_complete_text1={@resize_complete=Resize Complete}</action>
+ <action function="set">tw_slider_text={@swipe_resize=Swipe to Resize}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1288,24 +1273,24 @@
<button style="main_button_half_width">
<condition var1="tw_partition_can_repair" op="=" var2="1"/>
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Repair File System</text>
+ <text>{@repair_btn=Repair File System}</text>
<actions>
<action function="set">tw_back=partitionoptions</action>
<action function="set">tw_action=repair</action>
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Repair %tw_partition_name%?</action>
+ <action function="set">tw_text1={@repair_confirm=Repair %tw_partition_name%?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Repairing...</action>
- <action function="set">tw_complete_text1=Repair Complete</action>
- <action function="set">tw_slider_text=Swipe to Repair</action>
+ <action function="set">tw_action_text1={@repairing=Repairing...}</action>
+ <action function="set">tw_complete_text1={@repair_complete=Repair Complete}</action>
+ <action function="set">tw_slider_text={@swipe_repair=Swipe to Repair}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_half_width">
<placement x="%center_x%" y="%row15a_y%"/>
- <text>Change File System</text>
+ <text>{@change_fs_btn=Change File System}</text>
<action function="page">selectfilesystem</action>
</button>
@@ -1345,32 +1330,32 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Change File System for: %tw_partition_name%</text>
+ <text>{@change_fs_for_hdr=Change File System for: %tw_partition_name%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Mount Point: %tw_partition_mount_point%</text>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>Current file system: %tw_partition_file_system%</text>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Some ROMs or kernels may not support some</text>
+ <text>{@change_fs_warn1=Some ROMs or kernels may not support some}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>file systems. Proceed with caution!</text>
+ <text>{@change_fs_warn2=file systems. Proceed with caution!}</text>
</text>
<button style="main_button_half_width">
@@ -1383,11 +1368,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext2</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT2?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT2</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1402,11 +1387,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext3</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT3?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT3</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1421,11 +1406,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext4</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT4?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT4</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1440,11 +1425,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=vfat</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to FAT?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=FAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1459,11 +1444,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=exfat</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to exFAT?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=exFAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1478,11 +1463,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=f2fs</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to F2FS?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=F2FS</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1503,17 +1488,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<text style="text_m">
@@ -1536,14 +1521,14 @@
<partitionlist>
<placement x="%col1_x_left%" y="%row4a_y%" w="%content_half_width%" h="%partitionlist_backup_height%"/>
- <text>Select Partitions to Backup:</text>
+ <text>{@sel_part_backup=Select Partitions to Backup:}</text>
<data name="tw_backup_list"/>
<listtype name="backup"/>
</partitionlist>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row2_y%"/>
- <text>Encryption:</text>
+ <text>{@encryption=Encryption:}</text>
</text>
<text style="text_m">
@@ -1552,7 +1537,7 @@
<condition var1="tw_encrypt_backup" var2="0"/>
</conditions>
<placement x="%col1_x_right%" y="%row3_y%"/>
- <text>disabled - set a password to enable</text>
+ <text>{@enc_disabled=disabled - set a password to enable}</text>
</text>
<text style="text_m">
@@ -1561,7 +1546,7 @@
<condition var1="tw_encrypt_backup" var2="1"/>
</conditions>
<placement x="%col1_x_right%" y="%row3_y%"/>
- <text>enabled</text>
+ <text>{@enc_enabled=enabled}</text>
</text>
<fill color="%fileselector_linecolor%">
@@ -1579,30 +1564,30 @@
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row5_y%"/>
- <text>Options:</text>
+ <text>{@options=Options:}</text>
</text>
<checkbox>
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Enable compression</text>
+ <text>{@enable_backup_comp_chk=Enable compression}</text>
<data variable="tw_use_compression"/>
</checkbox>
<checkbox>
<placement x="%col1_x_right%" y="%row7a_y%"/>
- <text>Skip MD5 generation during backup</text>
+ <text>{@skip_md5_backup_chk=Skip MD5 generation during backup}</text>
<data variable="tw_skip_md5_generate"/>
</checkbox>
<checkbox>
<placement x="%col1_x_right%" y="%row9_y%"/>
- <text>Disable Free Space Check</text>
+ <text>{@disable_backup_space_chk=Disable Free Space Check}</text>
<data variable="tw_disable_free_space"/>
</checkbox>
<button style="main_button_half_width">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=backup</action>
<action function="overlay">select_storage</action>
@@ -1611,7 +1596,7 @@
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Refresh Sizes</text>
+ <text>{@refresh_sizes_btn=Refresh Sizes}</text>
<actions>
<action function="refreshsizes"/>
<action function="page">backup</action>
@@ -1619,7 +1604,7 @@
</button>
<slider>
- <text>Swipe to Backup</text>
+ <text>{@swipe_backup=Swipe to Backup}</text>
<action function="page">backup_run</action>
</slider>
@@ -1636,7 +1621,7 @@
<page name="backupname1">
<action>
- <condition var1="tw_backup_name" op="=" var2="(Auto Generate)"/>
+ <condition var1="tw_backup_name" op="=" var2="{@auto_generate=(Auto Generate)}"/>
<action function="generatebackupname"/>
</action>
@@ -1650,17 +1635,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -1688,21 +1673,21 @@
<text style="text_m_fail">
<condition var1="tw_fileexists" var2="1"/>
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>A backup with that name already exists!</text>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
</text>
<button style="main_button_half_width_low">
<placement x="%indent%" y="%row5_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">backup</action>
</actions>
</button>
<button style="main_button_half_width_low">
<placement x="%date_button_x%" y="%row5_y%"/>
- <text>Append Date</text>
+ <text>{@append_date_btn=Append Date}</text>
<action function="appenddatetobackupname"/>
</button>
@@ -1711,7 +1696,7 @@
<action>
<touch key="home"/>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">main</action>
</actions>
</action>
@@ -1719,7 +1704,7 @@
<action>
<touch key="back"/>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">backup</action>
</actions>
</action>
@@ -1730,17 +1715,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row2_y%"/>
- <text>Encryption Password:</text>
+ <text>{@enter_pass=Enter Password:}</text>
</text>
<input>
@@ -1763,12 +1748,12 @@
<text style="text_m_fail">
<condition var1="tw_password_not_match" var2="1"/>
<placement x="%col1_x_right%" y="%row4_y%"/>
- <text>Passwords do not match!</text>
+ <text>{@pass_not_match=Passwords do not match!}</text>
</text>
<button style="main_button_half_width_low">
<placement x="%center_x%" y="%row5_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_encrypt_backup=0</action>
<action function="set">tw_backup_password=</action>
@@ -1797,17 +1782,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row2_y%"/>
- <text>Encryption Password:</text>
+ <text>{@enter_pass=Enter Password:}</text>
</text>
<input>
@@ -1824,12 +1809,12 @@
<text style="text_m">
<placement x="%col1_x_right%" y="%row4_y%"/>
- <text>Enter Password again!</text>
+ <text>{@enter_pass2=Enter Password again:}</text>
</text>
<button style="main_button_half_width_low">
<placement x="%center_x%" y="%row5_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_encrypt_backup=0</action>
<action function="set">tw_backup_password=</action>
@@ -1895,7 +1880,7 @@
<text style="text_m_accent">
<placement x="%progress_text_x%" y="%progress_text_y%"/>
- <text>Progress:</text>
+ <text>{@progress=Progress:}</text>
</text>
<text style="text_m">
@@ -1910,7 +1895,7 @@
<button style="main_button_half_width">
<placement x="%col2_x_right%" y="%row15a_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="cancelbackup"/>
</button>
@@ -1923,7 +1908,7 @@
<condition var1="tw_cancel_backup" var2="0"/>
<actions>
<action function="set">tw_back=backup</action>
- <action function="set">tw_complete_text1=Backup Complete</action>
+ <action function="set">tw_complete_text1={@backup_complete=Backup Complete}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -1934,7 +1919,7 @@
<condition var1="tw_cancel_backup" var2="1"/>
<actions>
<action function="set">tw_back=backup</action>
- <action function="set">tw_complete_text1=Backup Cancelled</action>
+ <action function="set">tw_complete_text1={@backup_cancel=Backup Cancelled}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -1946,19 +1931,19 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@restore_sel_store_hdr=Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="sort_options"/>
<fileselector>
<placement x="%col1_x_left%" y="%row1a_y%" w="%content_quarter_width%" h="%fileselector_install_height%"/>
- <text>Select Package to Restore:</text>
+ <text>{@restore_sel_pack_fs=Select Package to Restore:}</text>
<filter folders="1" files="0" nav="0"/>
<path name="tw_backups_folder"/>
<data name="tw_restore" default=""/>
@@ -1967,7 +1952,7 @@
<button style="main_button_half_width_low">
<placement x="%col_button_right%" y="%row16a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=restore</action>
<action function="overlay">select_storage</action>
@@ -2015,17 +2000,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Encrypted Backup</text>
+ <text>{@restore_enc_backup_hdr=Encrypted Backup}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Enter Password:</text>
+ <text>{@enter_pass=Enter Password:}</text>
</text>
<input>
@@ -2048,12 +2033,12 @@
<text style="text_m_fail">
<condition var1="tw_password_fail" var2="1"/>
<placement x="%col1_x_left%" y="%row5_y%"/>
- <text>Password failed, please try again!</text>
+ <text>{@restore_dec_fail=Password failed, please try again!}</text>
</text>
<button style="main_button_half_width_low">
<placement x="%indent%" y="%row6_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">restore</action>
@@ -2062,16 +2047,17 @@
<button style="main_button_half_width_low">
<placement x="%col_button_right%" y="%row6_y%"/>
- <text>Delete Backup</text>
+ <text>{@del_backup_btn=Delete Backup}</text>
<actions>
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && rm -rf "%tw_restore_name%"</action>
- <action function="set">tw_text1=Delete Backup? %tw_restore_name%</action>
- <action function="set">tw_text2=This cannot be undone!</action>
- <action function="set">tw_action_text1=Deleting Backup...</action>
- <action function="set">tw_complete_text1=Backup Delete Complete</action>
- <action function="set">tw_slider_text=Swipe to Delete</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -2094,12 +2080,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Encrypted Backup - Trying Decryption</text>
+ <text>{@restore_try_decrypt=Encrypted Backup - Trying Decryption}</text>
</text>
<template name="console"/>
@@ -2138,17 +2124,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Backup made on %tw_restore_file_date%</text>
+ <text>{@restore_backup_date=Backup made on %tw_restore_file_date%}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<text style="text_m">
@@ -2172,41 +2158,41 @@
<partitionlist>
<placement x="%col1_x_left%" y="%row4a_y%" w="%content_half_width%" h="%partitionlist_backup_height%"/>
- <text>Select Partitions to Restore:</text>
+ <text>{@restore_sel_part=Select Partitions to Restore:}</text>
<data name="tw_restore_list" selectedlist="tw_restore_selected"/>
<listtype name="restore"/>
</partitionlist>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row5_y%"/>
- <text>Options:</text>
+ <text>{@options=Options:}</text>
</text>
<checkbox>
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Enable MD5 Verification of Backup Files</text>
+ <text>{@retore_enable_md5_chk=Enable MD5 Verification of Backup Files}</text>
<data variable="tw_skip_md5_check"/>
</checkbox>
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Delete Backup</text>
+ <text>{@del_backup_btn=Delete Backup}</text>
<actions>
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && rm -rf "%tw_restore_name%"</action>
- <action function="set">tw_text1=Delete Backup?</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
<action function="set">tw_text2=%tw_restore_name%</action>
- <action function="set">tw_text4=This cannot be undone!</action>
- <action function="set">tw_action_text1=Deleting Backup...</action>
- <action function="set">tw_complete_text1=Backup Delete Complete</action>
- <action function="set">tw_slider_text=Swipe to Delete</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<slider>
- <text>Swipe to Restore</text>
+ <text>{@swipe_restore=Swipe to Restore}</text>
<action function="page">restore_run</action>
</slider>
@@ -2226,17 +2212,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Rename Backup</text>
+ <text>{@rename_backup_hdr=Rename Backup}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -2248,11 +2234,11 @@
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && mv "%tw_restore_name%" "%tw_backup_rename%"</action>
- <action function="set">tw_text1=Rename Backup?</action>
- <action function="set">tw_text2=This cannot be undone!</action>
- <action function="set">tw_action_text1=Renaming Backup...</action>
- <action function="set">tw_complete_text1=Backup Rename Complete</action>
- <action function="set">tw_slider_text=Swipe to Rename</action>
+ <action function="set">tw_text1={@rename_backup_confirm=Rename Backup?}</action>
+ <action function="set">tw_text2={@rename_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@renaming_backup=Renaming Backup...}</action>
+ <action function="set">tw_complete_text1={@rename_backup_complete=Backup Rename Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_rename=Swipe to Rename}</action>
<action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_rename%</action>
<action function="set">tw_existpage=renamebackup</action>
<action function="set">tw_notexistpage=confirm_action</action>
@@ -2272,12 +2258,12 @@
<text style="text_m_fail">
<condition var1="tw_fileexists" var2="1"/>
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>A backup with that name already exists!</text>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
</text>
<button style="main_button_half_width_low">
<placement x="%indent%" y="%row5_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">restore_select</action>
</button>
@@ -2299,7 +2285,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
@@ -2313,7 +2299,7 @@
<text style="text_m_accent">
<placement x="%progress_text_x%" y="%progress_text_y%"/>
- <text>Progress:</text>
+ <text>{@progress=Progress:}</text>
</text>
<text style="text_m">
@@ -2325,7 +2311,7 @@
<condition var1="tw_operation_state" var2="1"/>
<actions>
<action function="set">tw_back=restore_select</action>
- <action function="set">tw_complete_text1=Restore Complete</action>
+ <action function="set">tw_complete_text1={@restore_complete=Restore Complete}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -2341,24 +2327,24 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<partitionlist>
<placement x="%col1_x_left%" y="%row1a_y%" w="%content_width%" h="%partitionlist_mount_height%"/>
- <text>Select Partitions to Mount:</text>
+ <text>{@mount_sel_part=Select Partitions to Mount:}</text>
<listtype name="mount"/>
</partitionlist>
<button style="checkbox">
<condition var1="tw_mount_system_ro" op="=" var2="0"/>
<placement x="%col1_x_left%" y="%row14_y%" textplacement="6"/>
- <text>Mount system partition read-only</text>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
<image resource="checkbox_false"/>
<action function="mountsystemtoggle">1</action>
</button>
@@ -2366,7 +2352,7 @@
<button style="checkbox">
<condition var1="tw_mount_system_ro" op="!=" var2="0"/>
<placement x="%col1_x_left%" y="%row14_y%" textplacement="6"/>
- <text>Mount system partition read-only</text>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
<image resource="checkbox_true"/>
<actions>
<action function="set">tw_lifetime_writes=2</action>
@@ -2377,7 +2363,7 @@
<button style="main_button_half_width">
<condition var1="tw_has_usb_storage" var2="1"/>
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Mount USB Storage</text>
+ <text>{@mount_usb_storage_btn=Mount USB Storage}</text>
<action function="page">usb_mount</action>
</button>
@@ -2387,13 +2373,13 @@
<condition var1="tw_is_decrypted" var2="0"/>
</conditions>
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Decrypt Data</text>
+ <text>{@decrypt_data_btn=Decrypt Data}</text>
<action function="page">decrypt</action>
</button>
<button style="main_button_half_width">
<placement x="%center_x%" y="%row15a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=mount</action>
<action function="overlay">select_storage</action>
@@ -2406,7 +2392,7 @@
<condition var1="tw_mtp_enabled" var2="0"/>
</conditions>
<placement x="%col2_x_right%" y="%row15a_y%"/>
- <text>Enable MTP</text>
+ <text>{@enable_mtp_btn=Enable MTP}</text>
<action function="startmtp"/>
</button>
@@ -2416,7 +2402,7 @@
<condition var1="tw_mtp_enabled" var2="1"/>
</conditions>
<placement x="%col2_x_right%" y="%row15a_y%"/>
- <text>Disable MTP</text>
+ <text>{@disable_mtp_btn=Disable MTP}</text>
<action function="stopmtp"/>
</button>
@@ -2436,32 +2422,32 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>USB Storage</text>
+ <text>{usb_storage_hdr=USB Storage}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>USB Storage Mounted</text>
+ <text>{@usb_stor_mnt1=USB Storage Mounted}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Be sure to safely remove your device</text>
+ <text>{@usb_stor_mnt2=Be sure to safely remove your device}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>from your computer before unmounting!</text>
+ <text>{@usb_stor_mnt3=from your computer before unmounting!}</text>
</text>
<button style="main_button_half_width">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Unmount USB-Storage</text>
+ <text>{@unmount_btn=Unmount}</text>
<action function="page">usb_umount</action>
</button>
@@ -2509,23 +2495,24 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Reboot Menu</text>
+ <text>{@reboot_hdr=Reboot Menu}</text>
</text>
<button style="main_button">
<condition var1="tw_reboot_system" var2="1"/>
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>System</text>
+ <text>{@rb_system_btn=System}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_action_text2=</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2533,17 +2520,17 @@
<button style="main_button">
<condition var1="tw_reboot_poweroff" var2="1"/>
<placement x="%center_x%" y="%row2_y%"/>
- <text>Power Off</text>
+ <text>{@rb_poweroff_btn=Power Off}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=poweroff</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to power off?</action>
- <action function="set">tw_action_text1=Turning Off...</action>
- <action function="set">tw_complete_text1=Turning Off...</action>
- <action function="set">tw_slider_text=Swipe to Power Off</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_ospo=sure you wish to power off?}</action>
+ <action function="set">tw_action_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_complete_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_slider_text={@swipe_power_off=Swipe to Power Off}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2551,17 +2538,17 @@
<button style="main_button">
<condition var1="tw_reboot_recovery" var2="1"/>
<placement x="%col1_x_left%" y="%row6a_y%"/>
- <text>Recovery</text>
+ <text>{@rb_recovery_btn=Recovery}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=recovery</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2569,17 +2556,17 @@
<button style="main_button">
<condition var1="tw_reboot_bootloader" var2="1"/>
<placement x="%center_x%" y="%row6a_y%"/>
- <text>Bootloader</text>
+ <text>{@rb_bootloader_btn=Bootloader}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=bootloader</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2587,17 +2574,17 @@
<button style="main_button">
<condition var1="tw_download_mode" var2="1"/>
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Download</text>
+ <text>{@rb_download_btn=Download}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=download</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2618,39 +2605,39 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Unmodified System Partition</text>
+ <text>{@sys_ro_hdr=Unmodified System Partition}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Keep System Read only?</text>
+ <text>{@sys_ro_keep=Keep System Read only?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>TWRP can leave your system partition unmodified to make it easier for you to take official updates.</text>
+ <text>{@sys_rol1=TWRP can leave your system partition unmodified to make it easier for you to take official updates.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>TWRP will be unable to prevent the stock ROM from replacing TWRP and will not offer to root your device.</text>
+ <text>{@sys_rol2=TWRP will be unable to prevent the stock ROM from replacing TWRP and will not offer to root your device.}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>Installing zips or performing adb operations may still modify the system partition.</text>
+ <text>{@sys_rol3=Installing zips or performing adb operations may still modify the system partition.}</text>
</text>
<checkbox>
<condition var1="tw_is_encrypted" var2="0"/>
<placement x="%col1_x_left%" y="%row14_y%"/>
- <text>Never show this screen during boot again</text>
+ <text>{@sys_ro_never_show_chk=Never show this screen during boot again}</text>
<data variable="tw_never_show_system_ro_page"/>
</checkbox>
<button style="main_button_half_width">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>Keep Read Only</text>
+ <text>{@sys_ro_keep_ro_btn=Keep Read Only}</text>
<actions>
<action function="mountsystemtoggle">1</action>
<action function="set">tw_page_done=1</action>
@@ -2659,7 +2646,7 @@
</button>
<slider>
- <text>Swipe to Allow Modifications</text>
+ <text>{@swipe_allow_mod=Swipe to Allow Modifications}</text>
<actions>
<action function="mountsystemtoggle">0</action>
<action function="set">tw_page_done=1</action>
@@ -2673,42 +2660,42 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>General Settings</text>
+ <text>{@settings_gen_hdr=General Settings}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="0" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="0" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<listbox style="scrolllist">
<placement x="%col1_x_left%" y="%row3a_y%" w="%content_half_width%" h="%listbox_settings_height%"/>
<icon selected="checkbox_true" unselected="checkbox_false"/>
- <listitem name="Zip file signature verification">
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
<data variable="tw_signed_zip_verify"/>
</listitem>
- <listitem name="Use rm -rf instead of formatting">
+ <listitem name="{@use_rmrf_chk=Use rm -rf instead of formatting}">
<data variable="tw_rm_rf"/>
</listitem>
- <listitem name="Skip MD5 generation during backup">
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
<data variable="tw_skip_md5_generate"/>
</listitem>
- <listitem name="Enable MD5 verification of backup files">
+ <listitem name="{@retore_enable_md5_chk=Enable MD5 verification of backup files}">
<data variable="tw_skip_md5_check"/>
</listitem>
- <listitem name="Use 24-hour clock">
+ <listitem name="{@use24clock_chk=Use 24-hour clock}">
<data variable="tw_military_time"/>
</listitem>
- <listitem name="Simulate actions for theme testing">
+ <listitem name="{@simact_chk=Simulate actions for theme testing}">
<data variable="tw_simulate_actions"/>
</listitem>
- <listitem name="Simulate failure for actions">
+ <listitem name="{@simfail_chk=Simulate failure for actions}">
<condition var1="tw_simulate_actions" var2="1"/>
<data variable="tw_simulate_fail"/>
</listitem>
@@ -2716,14 +2703,14 @@
<checkbox>
<placement x="%col1_x_right%" y="%row3a_y%"/>
- <text>Reversed navbar layout</text>
+ <text>{@rev_navbar_chk=Reversed navbar layout}</text>
<data variable="tw_samsung_navbar"/>
</checkbox>
<button style="radiobutton">
<condition var1="tw_navbar_button_position" op="!=" var2="0"/>
<placement x="%col1_x_right%" y="%row5_y%" textplacement="6"/>
- <text>Center navbar buttons</text>
+ <text>{@ctr_navbar_rdo=Center navbar buttons}</text>
<image resource="radio_false"/>
<action function="set">tw_navbar_button_position=0</action>
</button>
@@ -2731,7 +2718,7 @@
<button style="radiobutton">
<condition var1="tw_navbar_button_position" var2="0"/>
<placement x="%col1_x_right%" y="%row5_y%" textplacement="6"/>
- <text>Center navbar buttons</text>
+ <text>{@ctr_navbar_rdo=Center navbar buttons}</text>
<image resource="radio_true"/>
<action function="set">tw_navbar_button_position=0</action>
</button>
@@ -2739,7 +2726,7 @@
<button style="radiobutton">
<condition var1="tw_navbar_button_position" op="!=" var2="1"/>
<placement x="%col1_x_right%" y="%row6a_y%" textplacement="6"/>
- <text>Left align navbar buttons</text>
+ <text>{@lft_navbar_rdo=Left align navbar buttons}</text>
<image resource="radio_false"/>
<action function="set">tw_navbar_button_position=1</action>
</button>
@@ -2747,7 +2734,7 @@
<button style="radiobutton">
<condition var1="tw_navbar_button_position" var2="1"/>
<placement x="%col1_x_right%" y="%row6a_y%" textplacement="6"/>
- <text>Left align navbar buttons</text>
+ <text>{@lft_navbar_rdo=Left align navbar buttons}</text>
<image resource="radio_true"/>
<action function="set">tw_navbar_button_position=1</action>
</button>
@@ -2755,7 +2742,7 @@
<button style="radiobutton">
<condition var1="tw_navbar_button_position" op="!=" var2="2"/>
<placement x="%col1_x_right%" y="%row8_y%" textplacement="6"/>
- <text>Right align navbar buttons</text>
+ <text>{@rht_navbar_rdo=Right align navbar buttons}</text>
<image resource="radio_false"/>
<action function="set">tw_navbar_button_position=2</action>
</button>
@@ -2763,14 +2750,14 @@
<button style="radiobutton">
<condition var1="tw_navbar_button_position" var2="2"/>
<placement x="%col1_x_right%" y="%row8_y%" textplacement="6"/>
- <text>Right align navbar buttons</text>
+ <text>{@rht_navbar_rdo=Right align navbar buttons}</text>
<image resource="radio_true"/>
<action function="set">tw_navbar_button_position=2</action>
</button>
<button style="main_button_half_width">
<placement x="%col2_x_right%" y="%row15a_y%"/>
- <text>Restore Defaults</text>
+ <text>{@restore_defaults_btn=Restore Defaults}</text>
<action function="restoredefaultsettings"/>
</button>
@@ -2790,83 +2777,83 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Time Zone Settings</text>
+ <text>{@time_zone_hdr=Time Zone}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="%tab4_col2_x%" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="%tab5_col2_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<listbox>
<placement x="%col1_x_left%" y="%row3_y%" w="%content_half_width%" h="%listbox_timezone_height%"/>
- <text>Select Time Zone:</text>
+ <text>{@sel_tz_list=Select Time Zone:}</text>
<data name="tw_time_zone_guisel"/>
- <listitem name="(UTC -11) Samoa, Midway Island">BST11;BDT</listitem>
- <listitem name="(UTC -10) Hawaii">HST10;HDT</listitem>
- <listitem name="(UTC -9) Alaska">AST9;ADT</listitem>
- <listitem name="(UTC -8) Pacific Time">PST8;PDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -7) Mountain Time">MST7;MDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -6) Central Time">CST6;CDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -5) Eastern Time">EST5;EDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -4) Atlantic Time">AST4;ADT</listitem>
- <listitem name="(UTC -3) Brazil, Buenos Aires">GRNLNDST3;GRNLNDDT</listitem>
- <listitem name="(UTC -2) Mid-Atlantic">FALKST2;FALKDT</listitem>
- <listitem name="(UTC -1) Azores, Cape Verde">AZOREST1;AZOREDT</listitem>
- <listitem name="(UTC 0) London, Dublin, Lisbon">GMT0;BST,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +1) Berlin, Brussels, Paris">CET-1;CEST,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +2) Athens, Istanbul, South Africa">WET-2;WET,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +3) Moscow, Baghdad">SAUST-3;SAUDT</listitem>
- <listitem name="(UTC +4) Abu Dhabi, Tbilisi, Muscat">WST-4;WDT</listitem>
- <listitem name="(UTC +5) Yekaterinburg, Islamabad">PAKST-5;PAKDT</listitem>
- <listitem name="(UTC +6) Almaty, Dhaka, Colombo">TASHST-6;TASHDT</listitem>
- <listitem name="(UTC +7) Bangkok, Hanoi, Jakarta">THAIST-7;THAIDT</listitem>
- <listitem name="(UTC +8) Beijing, Singapore, Hong Kong">TAIST-8;TAIDT</listitem>
- <listitem name="(UTC +9) Tokyo, Seoul, Yakutsk">JST-9;JSTDT</listitem>
- <listitem name="(UTC +10) Eastern Australia, Guam">EET-10;EETDT</listitem>
- <listitem name="(UTC +11) Vladivostok, Solomon Islands">MET-11;METDT</listitem>
- <listitem name="(UTC +12) Auckland, Wellington, Fiji">NZST-12;NZDT</listitem>
+ <listitem name="{@utcm11=(UTC -11) Samoa, Midway Island}">BST11;BDT</listitem>
+ <listitem name="{@utcm10=(UTC -10) Hawaii}">HST10;HDT</listitem>
+ <listitem name="{@utcm9=(UTC -9) Alaska}">AST9;ADT</listitem>
+ <listitem name="{@utcm8=(UTC -8) Pacific Time}">PST8;PDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm7=(UTC -7) Mountain Time}">MST7;MDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm6=(UTC -6) Central Time}">CST6;CDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm5=(UTC -5) Eastern Time}">EST5;EDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm4=(UTC -4) Atlantic Time}">AST4;ADT</listitem>
+ <listitem name="{@utcm3=(UTC -3) Brazil, Buenos Aires}">GRNLNDST3;GRNLNDDT</listitem>
+ <listitem name="{@utcm2=(UTC -2) Mid-Atlantic}">FALKST2;FALKDT</listitem>
+ <listitem name="{@utcm1=(UTC -1) Azores, Cape Verde}">AZOREST1;AZOREDT</listitem>
+ <listitem name="{@utc0=(UTC 0) London, Dublin, Lisbon}">GMT0;BST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp1=(UTC +1) Berlin, Brussels, Paris}">CET-1;CEST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp2=(UTC +2) Athens, Istanbul, South Africa}">WET-2;WET,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp3=(UTC +3) Moscow, Baghdad}">SAUST-3;SAUDT</listitem>
+ <listitem name="{@utcp4=(UTC +4) Abu Dhabi, Tbilisi, Muscat}">WST-4;WDT</listitem>
+ <listitem name="{@utcp5=(UTC +5) Yekaterinburg, Islamabad}">PAKST-5;PAKDT</listitem>
+ <listitem name="{@utcp6=(UTC +6) Almaty, Dhaka, Colombo}">TASHST-6;TASHDT</listitem>
+ <listitem name="{@utcp7=(UTC +7) Bangkok, Hanoi, Jakarta}">THAIST-7;THAIDT</listitem>
+ <listitem name="{@utcp8=(UTC +8) Beijing, Singapore, Hong Kong}">TAIST-8;TAIDT</listitem>
+ <listitem name="{@utcp9=(UTC +9) Tokyo, Seoul, Yakutsk}">JST-9;JSTDT</listitem>
+ <listitem name="{@utcp10=(UTC +10) Eastern Australia, Guam}">EET-10;EETDT</listitem>
+ <listitem name="{@utcp11=(UTC +11) Vladivostok, Solomon Islands}">MET-11;METDT</listitem>
+ <listitem name="{@utcp12=(UTC +12) Auckland, Wellington, Fiji}">NZST-12;NZDT</listitem>
</listbox>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row3a_y%"/>
- <text>Select Offset (usually 0): %tw_time_zone_guioffset%</text>
+ <text>{@sel_tz_offset=Select Offset (usually 0): %tw_time_zone_guioffset%}</text>
</text>
<button style="button_quarter_width">
<placement x="%col1_x_right%" y="%row5_y%"/>
- <text>None</text>
+ <text>{@tz_offset_none=None}</text>
<action function="set">tw_time_zone_guioffset=0</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col2_x_right%" y="%row5_y%"/>
- <text>15</text>
+ <text>{@tz_offset_15=15}</text>
<action function="set">tw_time_zone_guioffset=15</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col3_x_right%" y="%row5_y%"/>
- <text>30</text>
+ <text>{@tz_offset_30=30}</text>
<action function="set">tw_time_zone_guioffset=30</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col4_x_right%" y="%row5_y%"/>
- <text>45</text>
+ <text>{@tz_offset_45=45}</text>
<action function="set">tw_time_zone_guioffset=45</action>
</button>
<checkbox>
<placement x="%col1_x_right%" y="%row7_y%"/>
<font resource="font_m" color="%text_color%"/>
- <text>Use daylight savings time (DST)</text>
+ <text>{@use_dst_chk=Use daylight savings time (DST)}</text>
<data variable="tw_time_zone_guidst"/>
<image checked="checkbox_true" unchecked="checkbox_false"/>
</checkbox>
@@ -2874,14 +2861,14 @@
<text color="%text_color%">
<font resource="font_m"/>
<placement x="%col1_x_right%" y="%row9_y%"/>
- <text>Current Time Zone: %tw_time_zone%</text>
+ <text>{@curr_tz=Current Time Zone: %tw_time_zone%}</text>
</text>
<button>
<highlight color="%highlight_color%"/>
<placement x="%col2_x_right%" y="%row15a_y%"/>
<font resource="font_m" color="%text_button_color%"/>
- <text>Set Time Zone</text>
+ <text>{@set_tz_btn=Set Time Zone}</text>
<image resource="main_button_half_width"/>
<action function="setguitimezone"/>
</button>
@@ -2902,18 +2889,18 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Screen Settings</text>
+ <text>{@settings_screen_hdr=Screen Settings}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="%center_x%" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="%tab5_col3_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<button>
@@ -2921,7 +2908,7 @@
<font resource="font_m" color="%text_color%"/>
<condition var1="tw_screen_timeout_secs" op="=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
- <text>Enable screen timeout.</text>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
<image resource="checkbox_false"/>
<action function="set">tw_screen_timeout_secs=60</action>
</button>
@@ -2931,7 +2918,7 @@
<font resource="font_m" color="%text_color%"/>
<condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
- <text>Enable screen timeout.</text>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
<image resource="checkbox_true"/>
<action function="set">tw_screen_timeout_secs=0</action>
</button>
@@ -2940,14 +2927,14 @@
<condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
<placement x="col1_x_left" y="%row5_y%" w="%content_width%"/>
- <text>Screen timeout in seconds:</text>
+ <text>{@screen_to_slider=Screen timeout in seconds:}</text>
<data variable="tw_screen_timeout_secs" min="15" max="300"/>
</slidervalue>
<slidervalue>
<condition var1="tw_has_brightnesss_file" var2="1"/>
<placement x="col1_x_left" y="%row10_y%" w="%content_width%"/>
- <text>Brightness: %tw_brightness_pct%%</text>
+ <text>{@screen_bright_slider=Brightness: %tw_brightness_pct%%}</text>
<data variable="tw_brightness_pct" min="10" max="100"/>
<actions>
<action function="set">tw_brightness=%tw_brightness_max%</action>
@@ -2973,35 +2960,35 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Vibration Settings</text>
+ <text>{@vibration_hdr=Vibration}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="%tab4_col4_x%" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="%tab5_col4_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<slidervalue>
<placement x="col1_x_left" y="%row4_y%" w="%content_width%"/>
- <text>Button Vibration:</text>
+ <text>{@button_vibration=Button Vibration:}</text>
<data variable="tw_button_vibrate" min="0" max="300"/>
</slidervalue>
<slidervalue>
<placement x="col1_x_left" y="%row9_y%" w="%content_width%"/>
- <text>Keyboard Vibration:</text>
+ <text>{@kb_vibration=Keyboard Vibration:}</text>
<data variable="tw_keyboard_vibrate" min="0" max="300"/>
</slidervalue>
<slidervalue>
<placement x="col1_x_left" y="%row14_y%" w="%content_width%"/>
- <text>Action Vibration:</text>
+ <text>{@act_vibration=Action Vibration:}</text>
<data variable="tw_action_vibrate" min="0" max="500"/>
</slidervalue>
@@ -3016,83 +3003,126 @@
</action>
</page>
+ <page name="settings_language">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@language_hdr=Language - %tw_language_display%}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col5_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%indent%" y="%row3_y%" w="%fileselector_filemanager_height%" h="%listbox_settings_height%"/>
+ <text>{@select_language=Select Language:}</text>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </listbox>
+
+ <button style="main_button_half_width_low">
+ <placement x="%col_button_right%" y="%row16a_y%"/>
+ <text>{@set_language_btn=Set Language}</text>
+ <action function="setlanguage"></action>
+ </button>
+
+ <action>
+ <touch key="home" />
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back" />
+ <action function="page">settings</action>
+ </action>
+ </page>
+
<page name="advanced">
<template name="page"/>
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<button style="main_button">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Copy Log to SD</text>
+ <text>{@copy_log_btn=Copy Log}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=copylog</action>
- <action function="set">tw_text1=Copy Log to SD Card?</action>
- <action function="set">tw_action_text1=Copying Log to SD Card...</action>
- <action function="set">tw_complete_text1=Log Copy Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@copy_log_confirm=Copy Log to SD Card?}</action>
+ <action function="set">tw_action_text1={@copying_log=Copying Log to SD Card...}</action>
+ <action function="set">tw_complete_text1={@copy_log_complete=Log Copy Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row2_y%"/>
- <text>Fix Permissions</text>
+ <text>{@fix_perm_btn=Fix Permissions}</text>
<action function="page">fixperms</action>
</button>
<button style="main_button">
<condition var1="tw_allow_partition_sdcard" var2="1"/>
<placement x="%col1_x_left%" y="%row6a_y%"/>
- <text>Partition SD Card</text>
+ <text>{@part_sd_btn=Partition SD Card}</text>
<action function="page">partsdcard</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row6a_y%"/>
- <text>File Manager</text>
+ <text>{@file_manager_btn=File Manager}</text>
<action function="page">filemanagerlist</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Terminal</text>
+ <text>{@terminal_btn=Terminal}</text>
<action function="page">terminalfolder</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row11_y%"/>
- <text>Reload Theme</text>
+ <text>{@reload_theme_btn=Reload Theme}</text>
<action function="reload"/>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row15a_y%"/>
- <text>ADB Sideload</text>
+ <text>{@adb_sideload_btn=ADB Sideload}</text>
<action function="page">sideload</action>
</button>
<button style="main_button">
<condition var1="tw_show_dumlock" var2="1"/>
<placement x="%center_x%" y="%row15a_y%"/>
- <text>HTC Dumlock</text>
+ <text>{@dumlock_btn=HTC Dumlock}</text>
<action function="page">htcdumlock</action>
</button>
<button style="main_button">
<condition var1="tw_has_injecttwrp" var2="1"/>
<placement x="%center_x%" y="%row15a_y%"/>
- <text>Re-Inject TWRP</text>
+ <text>{@inject_twrp_btn=Inject TWRP}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=reinjecttwrp</action>
- <action function="set">tw_text1=Re-Inject TWRP?</action>
- <action function="set">tw_action_text1=Re-Injecting TWRP...</action>
- <action function="set">tw_complete_text1=TWRP Injection Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@inject_twrp_confirm=Re-Inject TWRP?}</action>
+ <action function="set">tw_action_text1={@injecting_twrp=Re-Injecting TWRP...}</action>
+ <action function="set">tw_complete_text1={@inject_twrp_complete=TWRP Injection Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -3113,27 +3143,27 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Partition SD Card</text>
+ <text>{@part_sd_hdr=Partition SD Card}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>You will lose all files on your SD card!</text>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>This action cannot be undone!</text>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>EXT Size:</text>
+ <text>{@part_sd_ext_sz=EXT Size:}</text>
</text>
<text style="text_m">
@@ -3143,19 +3173,19 @@
<button style="button_quarter_width">
<placement x="%btn4_col3_x_left%" y="%row5_y%"/>
- <text>-</text>
+ <text>{@part_sd_m=-}</text>
<action function="addsubtract">tw_sdext_size-128</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col2_x_right%" y="%row5_y%"/>
- <text>+</text>
+ <text>{@part_sd_p=+}</text>
<action function="addsubtract">tw_sdext_size+128</action>
</button>
<text style="text_m_accent">
<placement x="%center_x%" y="%row9_y%" placement="5"/>
- <text>Swap Size:</text>
+ <text>{@part_sd_swap_sz=Swap Size:}</text>
</text>
<text style="text_m">
@@ -3165,19 +3195,19 @@
<button style="button_quarter_width">
<placement x="%btn4_col3_x_left%" y="%row9_y%"/>
- <text>-</text>
+ <text>{@part_sd_m=-}</text>
<action function="addsubtract">tw_swap_size-32</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col2_x_right%" y="%row9_y%"/>
- <text>+</text>
+ <text>{@part_sd_p=+}</text>
<action function="addsubtract">tw_swap_size+32</action>
</button>
<text style="text_m_accent">
<placement x="%center_x%" y="%row13_y%" placement="5"/>
- <text>File System:</text>
+ <text>{@file_system=File System:}</text>
</text>
<text style="text_m">
@@ -3198,7 +3228,7 @@
</button>
<slider style="slider_centered">
- <text>Swipe to Partition</text>
+ <text>{@swipe_part_sd=Swipe to Partition}</text>
<action function="page">partsdcardaction</action>
<actions>
<action function="set">tw_back=partsdcard</action>
@@ -3206,9 +3236,9 @@
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=set</action>
<action function="set">tw_action2_param=tw_zip_location=/sdcard</action>
- <action function="set">tw_action_text1=Partitioning SD Card...</action>
- <action function="set">tw_action_text2=This will take a few minutes.</action>
- <action function="set">tw_complete_text1=Partitioning Complete</action>
+ <action function="set">tw_action_text1={@partitioning_sd=Partitioning SD Card...}</action>
+ <action function="set">tw_action_text2={@partitioning_sd2=This will take a few minutes.}</action>
+ <action function="set">tw_complete_text1={@part_sd_complete=Partitioning Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -3229,52 +3259,52 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>HTC Dumlock</text>
+ <text>{@dumlock_hdr=HTC Dumlock}</text>
</text>
<button style="main_button_m">
<placement x="%col2_x_left%" y="%row2_y%"/>
- <text>Restore Original Boot</text>
+ <text>{@dumlock_restore_btn=Restore Original Boot}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=htcdumlockrestoreboot</action>
- <action function="set">tw_text1=Restore original boot image?</action>
- <action function="set">tw_action_text1=Restoring Original Boot...</action>
- <action function="set">tw_complete_text1=Restore Original Boot Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@dumlock_restore_confirm=Restore original boot image?}</action>
+ <action function="set">tw_action_text1={@dumlock_restoring=Restoring Original Boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_restore_complete=Restore Original Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_m">
<placement x="%col2_x_left%" y="%row6a_y%"/>
- <text>Reflash Recovery</text>
+ <text>{@dumlock_reflash_btn=Reflash Recovery}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=htcdumlockreflashrecovery</action>
- <action function="set">tw_text1=Reflash recovery to boot?</action>
- <action function="set">tw_action_text1=Flashing recovery to boot...</action>
- <action function="set">tw_complete_text1=Recovery Flash to Boot Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@dumlock_reflash_confirm=Reflash recovery to boot?}</action>
+ <action function="set">tw_action_text1={@dumlock_reflashing=Flashing recovery to boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_reflash_complete=Recovery Flash to Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_m">
<placement x="%col2_x_left%" y="%row11_y%"/>
- <text>Install HTC Dumlock</text>
+ <text>{@dumlock_install_btn=Install HTC Dumlock}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=installhtcdumlock</action>
- <action function="set">tw_text1=Install HTC dumlock files to ROM?</action>
- <action function="set">tw_action_text1=Installing HTC Dumlock...</action>
- <action function="set">tw_complete_text1=HTC Dumlock Install Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@dumlock_install_confirm=Install HTC dumlock files to ROM?}</action>
+ <action function="set">tw_action_text1={@dumlock_installing=Installing HTC Dumlock...}</action>
+ <action function="set">tw_complete_text1={@dumlock_install_complete=HTC Dumlock Install Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -3299,7 +3329,7 @@
</image>
<slider style="slider_centered">
- <text>Swipe to Unlock</text>
+ <text>{@swipe_to_unlock=Swipe to Unlock}</text>
<action function="overlay"/>
</slider>
</page>
@@ -3309,12 +3339,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select a File or Folder</text>
+ <text>{@fm_sel_file=Select a File or Folder}</text>
</text>
<template name="sort_options"/>
@@ -3330,18 +3360,18 @@
<button style="main_button_half_width_low">
<placement x="%col_button_right%" y="%row16a_y%"/>
- <text>Select current Folder</text>
+ <text>{@fm_sel_curr_folder=Select Current Folder}</text>
<actions>
<action function="set">tw_filename1=tw_file_location1</action>
<action function="set">tw_fm_isfolder=1</action>
- <action function="set">tw_fm_type=Folder</action>
+ <action function="set">tw_fm_type={@fm_type_folder=Folder}</action>
<action function="page">filemanageroptions</action>
</actions>
</button>
<action>
<actions>
- <action function="set">tw_fm_type=File</action>
+ <action function="set">tw_fm_type={@fm_type_file=File}</action>
<action function="set">tw_fm_isfolder=0</action>
</actions>
</action>
@@ -3367,17 +3397,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Choose Action</text>
+ <text>{@fm_choose_act=Choose Action}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>%tw_fm_type% selected:</text>
+ <text>{@fm_selected=%tw_fm_type% selected:}</text>
</text>
<text style="text_m">
@@ -3388,10 +3418,10 @@
<button style="main_button_half_width">
<condition var1="tw_fm_isfolder" var2="0"/>
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Copy File</text>
+ <text>{@fm_copy_file_btn=Copy File}</text>
<actions>
<action function="set">tw_filemanager_command=cp</action>
- <action function="set">tw_fm_text1=Copying</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
@@ -3399,30 +3429,30 @@
<button style="main_button_half_width">
<condition var1="tw_fm_isfolder" var2="1"/>
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Copy Folder</text>
+ <text>{@fm_copy_folder_btn=Copy Folder}</text>
<actions>
<action function="set">tw_filemanager_command=cd "%tw_file_location1%" && cd .. && cp -R</action>
- <action function="set">tw_fm_text1=Copying</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row11_y%"/>
- <text>Move</text>
+ <text>{@fm_move_btn=Move}</text>
<actions>
<action function="set">tw_filemanager_command=mv</action>
- <action function="set">tw_fm_text1=Moving</action>
+ <action function="set">tw_fm_text1={@fm_moving=Moving}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>chmod 755</text>
+ <text>{@fm_chmod755_btn=chmod 755}</text>
<actions>
<action function="set">tw_filemanager_command=chmod 755</action>
- <action function="set">tw_fm_text1=chmod 755</action>
+ <action function="set">tw_fm_text1={@fm_chmod755ing=chmod 755}</action>
<action function="set">tw_fm_text2=</action>
<action function="set">tw_fm_text3=</action>
<action function="set">tw_include_text3=0</action>
@@ -3433,7 +3463,7 @@
<button style="main_button_half_width">
<placement x="%center_x%" y="%row15a_y%"/>
- <text>chmod</text>
+ <text>{@fm_chmod_btn=chmod}</text>
<actions>
<action function="set">tw_filemanager_rename=0000</action>
<action function="set">tw_fm_text2=</action>
@@ -3446,10 +3476,10 @@
<button style="main_button_half_width">
<placement x="%col2_x_right%" y="%row11_y%"/>
- <text>Delete</text>
+ <text>{@fm_delete_btn=Delete}</text>
<actions>
<action function="set">tw_filemanager_command=rm -rf</action>
- <action function="set">tw_fm_text1=Deleting</action>
+ <action function="set">tw_fm_text1={@fm_deleting=Deleting}</action>
<action function="set">tw_fm_text2=</action>
<action function="set">tw_fm_text3=</action>
<action function="set">tw_include_text3=0</action>
@@ -3461,10 +3491,10 @@
<button style="main_button_half_width">
<condition var1="tw_fm_isfolder" var2="0"/>
<placement x="%center_x%" y="%row11_y%"/>
- <text>Rename File</text>
+ <text>{@fm_rename_file_btn=Rename File}</text>
<actions>
<action function="set">tw_filemanager_rename=tw_selection1</action>
- <action function="set">tw_fm_text1=Renaming</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
<action function="set">tw_filemanager_command=mv</action>
<action function="page">filemanagerrenamefile</action>
</actions>
@@ -3473,10 +3503,10 @@
<button style="main_button_half_width">
<condition var1="tw_fm_isfolder" var2="1"/>
<placement x="%center_x%" y="%row11_y%"/>
- <text>Rename Folder</text>
+ <text>{@fm_rename_folder_btn=Rename Folder}</text>
<actions>
<action function="set">tw_filemanager_rename=tw_selection1</action>
- <action function="set">tw_fm_text1=Renaming</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
<action function="set">tw_filemanager_command=cd "%tw_file_location1%" && cd .. && mv</action>
<action function="page">filemanagerrenamefolder</action>
</actions>
@@ -3498,12 +3528,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select Destination Folder</text>
+ <text>{@fm_sel_dest=Select Destination Folder}</text>
</text>
<template name="sort_options"/>
@@ -3519,7 +3549,7 @@
<button style="main_button_half_width_low">
<placement x="%col_button_right%" y="%row16a_y%"/>
- <text>Select current Folder</text>
+ <text>{@fm_sel_curr_folder=Select Current Folder}</text>
<actions>
<action function="set">tw_fm_text2=to</action>
<action function="set">tw_fm_text3=%tw_file_location2%</action>
@@ -3545,17 +3575,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Rename %tw_fm_type%</text>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -3578,7 +3608,7 @@
<button style="main_button_half_width_low">
<placement x="%indent%" y="%row5_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -3600,17 +3630,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Rename %tw_fm_type%</text>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -3633,7 +3663,7 @@
<button style="main_button_half_width_low">
<placement x="%indent%" y="%row5_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -3655,17 +3685,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Set Permissions</text>
+ <text>{@fm_set_perms_hdr=Set Permissions}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Permissions:</text>
+ <text>{@fm_perms=Permissions:}</text>
</text>
<input>
@@ -3687,7 +3717,7 @@
<button style="main_button_half_width_low">
<placement x="%indent%" y="%row5_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -3709,12 +3739,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Confirm Action</text>
+ <text>{@confirm_action=Confirm Action}</text>
</text>
<text style="text_m_accent">
@@ -3739,11 +3769,11 @@
<text style="text_m">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<slider style="slider_centered">
- <text>Swipe to Confirm</text>
+ <text>{@swipe_to_confirm=Swipe to Confirm}</text>
<action function="page">filemanageraction</action>
</slider>
@@ -3763,7 +3793,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
@@ -3782,7 +3812,7 @@
</conditions>
<actions>
<action function="set">tw_back=filemanagerlist</action>
- <action function="set">tw_complete_text1=File Operation Complete</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
<action function="page">action_complete</action>
</actions>
</action>
@@ -3793,7 +3823,7 @@
<condition var1="tw_operation_status" op="!=" var2="0"/>
</conditions>
<actions>
- <action function="set">tw_complete_text1=File Operation Complete</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
<action function="page">action_complete</action>
</actions>
</action>
@@ -3819,17 +3849,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Decrypt Data</text>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Enter Password:</text>
+ <text>{@decrypt_data_enter_pass=Enter Password:}</text>
</text>
<input>
@@ -3852,12 +3882,12 @@
<text style="text_m_fail">
<condition var1="tw_password_fail" var2="1"/>
<placement x="%col1_x_left%" y="%row5_y%"/>
- <text>Password failed, please try again!</text>
+ <text>{@decryt_data_failed=Password failed, please try again!}</text>
</text>
<button style="main_button_half_width_low">
<placement x="%indent%" y="%row6_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">main</action>
@@ -3872,17 +3902,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Decrypt Data</text>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Enter Pattern:</text>
+ <text>{@decrypt_data_enter_pattern=Enter Pattern.}</text>
</text>
<patternpassword>
@@ -3896,7 +3926,7 @@
<button style="main_button_half_width">
<placement x="%col2_x_right%" y="%row15a_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">main</action>
@@ -3909,12 +3939,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Decrypt Data - Trying Decryption</text>
+ <text>{@decrypt_data_trying=Trying Decryption}</text>
</text>
<template name="console"/>
@@ -3953,12 +3983,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Terminal Command</text>
+ <text>{term_hdr=Terminal Command}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Browse to Starting Folder</text>
+ <text>{@term_sel_folder_hdr=Browse to Starting Folder}</text>
</text>
<template name="sort_options"/>
@@ -3974,7 +4004,7 @@
<button style="main_button_half_width_low">
<placement x="%col_button_right%" y="%row16a_y%"/>
- <text>Select current Folder</text>
+ <text>{@fm_sel_curr_folder=Select Current Folder}</text>
<action function="page">terminalcommand</action>
</button>
@@ -4015,7 +4045,7 @@
<highlight color="%highlight_color%"/>
<placement x="%btn4_col4_x_right%" y="%row7a_y%"/>
<font resource="font_m" color="%text_button_color%"/>
- <text>Kill</text>
+ <text>{@term_kill_btn=Kill}</text>
<image resource="tab_4"/>
<action function="killterminal"/>
</button>
@@ -4038,35 +4068,35 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>ADB Sideload</text>
+ <text>{@adb_sideload_hdr=ADB Sideload}</text>
</text>
<checkbox>
<placement x="%col1_x_left%" y="%row2_y%"/>
- <text>Wipe Dalvik Cache</text>
+ <text>{@sideload_wipe_dalvik_chk=Wipe Dalvik Cache}</text>
<data variable="tw_wipe_dalvik"/>
</checkbox>
<checkbox>
<placement x="%col1_x_left%" y="%row3a_y%"/>
- <text>Wipe Cache</text>
+ <text>{@sideload_wipe_cache_chk=Wipe Cache}</text>
<data variable="tw_wipe_cache"/>
</checkbox>
<slider style="slider_centered">
- <text>Swipe to start Sideload</text>
+ <text>{@swipe_to_sideload=Swipe to Start Sideload}</text>
<action function="page">partsdcardaction</action>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=adbsideload</action>
- <action function="set">tw_action_text1=ADB Sideload</action>
- <action function="set">tw_action_text2=Usage: adb sideload filename.zip</action>
- <action function="set">tw_complete_text1=ADB Sideload Complete</action>
+ <action function="set">tw_action_text1={@sideload_confirm=ADB Sideload}</action>
+ <action function="set">tw_action_text2={@sideload_usage=Usage: adb sideload filename.zip}</action>
+ <action function="set">tw_complete_text1={@sideload_complete=ADB Sideload Complete}</action>
<action function="set">tw_has_cancel=1</action>
<action function="set">tw_show_reboot=1</action>
<action function="set">tw_cancel_action=adbsideloadcancel</action>
@@ -4090,43 +4120,43 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Fix Permissions</text>
+ <text>{@fix_perms_hdr=Fix Permissions}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Note: Fixing permissions is rarely needed.</text>
+ <text>{@fix_perms_note=Note: Fixing permissions is rarely needed.}</text>
</text>
<checkbox>
<placement x="%col2_x_left%" y="%row4_y%"/>
- <text>Also fix SELinux Contexts</text>
+ <text>{@fix_perms_selinux_chk=Also fix SELinux Contexts}</text>
<data variable="tw_fixperms_restorecon"/>
</checkbox>
<text style="text_m_fail">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>Fixing SELinux Contexts may cause</text>
+ <text>{@fix_perms_sel_note1=Fixing SELinux Contexts may cause}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>your device to not boot properly.</text>
+ <text>{@fix_perms_sel_note2=your device to not boot properly.}</text>
</text>
<slider style="slider_centered">
- <text>Swipe to Fix Permissions</text>
+ <text>{@swipe_to_fix_perms=Swipe to Fix Permissions}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=fixpermissions</action>
- <action function="set">tw_action_text1=Fixing Permissions...</action>
- <action function="set">tw_complete_text1=Fix Permissions Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_action_text1={@fixing_perms=Fixing Permissions...}</action>
+ <action function="set">tw_complete_text1={@fix_perms_complete=Fix Permissions Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_page</action>
</actions>
@@ -4148,40 +4178,40 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Reboot</text>
+ <text>{@reboot_hdr=Reboot}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>SuperSU Check</text>
+ <text>{@su_hdr=SuperSU Check}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Your device does not appear to be rooted.</text>
+ <text>{@su_note1=Your device does not appear to be rooted.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Install SuperSU now?</text>
+ <text>{@su_note2=Install SuperSU now?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>This will root your device.</text>
+ <text>{@su_note3=This will root your device.}</text>
</text>
<button style="main_button_half_width">
<placement x="%col2_x_left%" y="%row15a_y%"/>
- <text>Do not Install</text>
+ <text>{@su_cancel=Do not Install}</text>
<action function="set">tw_page_done=1</action>
</button>
<slider>
- <text>Swipe to Install</text>
+ <text>{@swipe_su_to_install=Swipe to Install}</text>
<actions>
<action function="set">tw_action=installsu</action>
- <action function="set">tw_action_text1=Installing SuperSU</action>
+ <action function="set">tw_action_text1={@su_installing=Installing SuperSU}</action>
<action function="set">tw_action_text2=</action>
<action function="page">singleaction_page</action>
</actions>
@@ -4219,14 +4249,14 @@
</fill>
<partitionlist style="partitionlist_storage">
- <text>Select Storage</text>
+ <text>{@sel_storage_list=Select Storage}</text>
<data name="tw_storage_path"/>
<listtype name="storage"/>
</partitionlist>
<button style="button_third_width">
<placement x="%dialog_button_x%" y="%row13_y%"/>
- <text>OK</text>
+ <text>{@ok_btn=OK}</text>
<actions>
<action function="set">tw_clear_destination=%tw_back%</action>
<action function="overlay"/>
diff --git a/gui/theme/common/languages/en.xml b/gui/theme/common/languages/en.xml
new file mode 100755
index 0000000..62b5b3d
--- /dev/null
+++ b/gui/theme/common/languages/en.xml
@@ -0,0 +1,666 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>English</display>
+
+ <resources>
+ <!-- Font overrides - only change these if your language requires special characters -->
+ <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+
+ <!-- Partition display names -->
+ <string name="system">System</string>
+ <string name="system_image">System Image</string>
+ <string name="vendor">Vendor</string>
+ <string name="vendor_image">Vendor Image</string>
+ <string name="boot">Boot</string>
+ <string name="recovery">Recovery</string>
+ <string name="cache">Cache</string>
+ <string name="data">Data</string>
+ <string name="sdcard">SDCard</string>
+ <string name="internal">Internal Storage</string>
+ <string name="microsd">Micro SDCard</string>
+ <string name="usbotg">USB OTG</string>
+ <string name="android_secure">Android Secure</string>
+ <string name="dalvik">Dalvik / ART Cache</string>
+ <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system -->
+ <string name="sdext">SD-EXT</string>
+ <string name="adopted_data">Adopted Data</string>
+ <string name="adopted_storage">Adopted Storage</string>
+
+ <!-- GUI XML strings -->
+ <string name="twrp_header">Team Win Recovery Project</string>
+ <string name="twrp_watch_header">TWRP %tw_version%</string>
+ <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string>
+ <string name="battery_pct">Battery: %tw_battery%</string>
+ <string name="sort_by_name">Sort by Name</string>
+ <string name="sort_by_date">Sort by Date</string>
+ <string name="sort_by_size">Sorty by Size</string>
+ <string name="sort_by_name_only">Name</string>
+ <string name="sort_by_date_only">Date</string>
+ <string name="sort_by_size_only">Size</string>
+ <string name="tab_general">GENERAL</string>
+ <string name="tab_options">OPTIONS</string>
+ <string name="tab_backup">BACKUP</string>
+ <string name="tab_time_zone">TIME ZONE</string>
+ <string name="tab_screen">SCREEN</string>
+ <string name="tab_vibration">VIBRATION</string>
+ <string name="tab_language">LANGUAGE</string>
+
+ <string name="install_btn">Install</string>
+ <string name="wipe_btn">Wipe</string>
+ <string name="backup_btn">Backup</string>
+ <string name="restore_btn">Restore</string>
+ <string name="mount_btn">Mount</string>
+ <string name="settings_btn">Settings</string>
+ <string name="advanced_btn">Advanced</string>
+ <string name="reboot_btn">Reboot</string>
+ <string name="files_btn">Files</string>
+ <string name="copy_log_btn">Copy Log</string>
+ <string name="select_type_hdr">Select Type</string>
+ <string name="install_zip_hdr">Install Zip</string>
+ <string name="install_zip_btn">Install Zip</string>
+ <string name="install_image_hdr">Install Image</string>
+ <string name="install_image_btn">Install Image</string>
+ <string name="install_select_file_hdr">Select File</string>
+ <string name="file_selector_folders_hdr">Folders</string>
+ <string name="select_file_from_storage">Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="adb_sideload_btn">ADB Sideload</string>
+ <string name="install_hdr">Install</string>
+ <string name="select_storage_hdr">Select Storage</string>
+ <string name="select_storage_btn">Select Storage</string>
+ <string name="queue_hdr">Queue</string>
+ <string name="zip_queue_count">%tw_zip_queue_count% of max of 10 Files queued</string>
+ <string name="zip_queue_count_s">File %tw_zip_queue_count% of 10:</string>
+ <string name="zip_warn1">This operation may install incompatible</string>
+ <string name="zip_warn2">software and render your device unusable.</string>
+ <string name="zip_back_cancel">Press back to cancel adding this zip.</string>
+ <string name="zip_back_clear">Press back button to clear the queue.</string>
+ <string name="folder">Folder:</string>
+ <string name="file">File:</string>
+ <string name="zip_sig_chk">Zip signature verification</string>
+ <string name="inject_twrp_chk">Inject TWRP after install</string>
+ <string name="options_hdr">Options</string>
+ <string name="confirm_flash_hdr">Confirm Flash</string>
+ <string name="zip_queue">Queue:</string>
+ <string name="options">Options:</string>
+ <string name="swipe_confirm"> Confirm</string>
+ <string name="zip_add_btn">Add more Zips</string>
+ <string name="zip_clear_btn">Clear Zip Queue</string>
+ <string name="install_zip_count_hdr">Install Zip %tw_zip_index% of %tw_zip_queue_count%</string>
+ <string name="installing_zip">Installing Zip: %tw_file%</string>
+ <string name="failed">Failed</string>
+ <string name="successful">Successful</string>
+ <string name="install_failed">Installation Failed</string>
+ <string name="install_successful">Installation Successful</string>
+ <string name="wipe_cache_dalvik_btn">Wipe cache/dalvik</string>
+ <string name="reboot_system_btn">Reboot System</string>
+ <string name="install_sel_target">Select Target Partition</string>
+ <string name="flash_image_select">Select Partition to Flash Image:</string>
+ <string name="target_partition">Target Partition:</string>
+ <string name="flashing_image">Flashing Image...</string>
+ <string name="image_flashed">Image Flashed</string>
+ <string name="wipe_cache_dalvik_confirm">Wipe Cache & Dalvik?</string>
+ <string name="wiping_cache_dalvik">Wiping Cache & Dalvik...</string>
+ <string name="wipe_cache_dalvik_complete">Cache & Dalvik Wipe Complete</string>
+ <string name="swipe_wipe">Swipe to Wipe</string>
+ <string name="swipe_wipe_s"> Wipe</string>
+ <string name="no_os1">No OS Installed! Are you</string>
+ <string name="no_osrb">sure you wish to reboot?</string>
+ <string name="no_ospo">sure you wish to power off?</string>
+ <string name="rebooting">Rebooting...</string>
+ <string name="swipe_reboot_s"> Reboot</string>
+ <string name="swipe_flash">Swipe to confirm Flash</string>
+ <string name="confirm_action">Confirm Action</string>
+ <string name="back_cancel">Press back button to cancel.</string>
+ <string name="cancel_btn">Cancel</string>
+ <string name="wipe_hdr">Wipe</string>
+ <string name="factory_reset_hdr">Factory Reset</string>
+ <string name="factory_reset_btn">Factory Reset</string>
+ <string name="factory_reset1">Wipes Data, Cache, and Dalvik</string>
+ <string name="factory_reset2">(not including internal storage)</string>
+ <string name="factory_reset3">Most of the time this is</string>
+ <string name="factory_reset4">the only wipe that you need.</string>
+ <string name="factory_resetting">Factory Reset...</string>
+ <string name="advanced_wipe_hdr">Advanced Wipe</string>
+ <string name="advanced_wipe_btn">Advanced Wipe</string>
+ <string name="wipe_enc_confirm">Wipe Encryption from Data?</string>
+ <string name="formatting_data">Formatting Data...</string>
+ <string name="swipe_format_data">Swipe to Format Data</string>
+ <string name="swipe_format_data_s"> Format Data</string>
+ <string name="factory_reset_complete">Factory Reset Complete</string>
+ <string name="sel_part_hdr">Select Partitions</string>
+ <string name="wipe_sel_confirm">Wipe Selected Partition(s)?</string>
+ <string name="wiping_part">Wiping Partition(s)...</string>
+ <string name="wipe_complete">Wipe Complete</string>
+ <string name="sel_part_wipe">Select Partitions to Wipe:</string>
+ <string name="invalid_part_sel">Invalid partition selection</string>
+ <string name="format_data_hdr">Format Data</string>
+ <string name="format_data_btn">Format Data</string>
+ <string name="format_data_ptr1">Format Data will wipe all of your apps,</string>
+ <string name="format_data_ptr2">backups, pictures, videos, media, and</string>
+ <string name="format_data_ptr3">removes encryption on internal storage.</string>
+ <string name="format_data_lcp1">Format Data will wipe all of your apps, backups, pictures, videos, media, and</string>
+ <string name="format_data_lcp2">removes encryption on internal storage.</string>
+ <string name="format_data_wtc1">Format Data will wipe all of your apps,</string>
+ <string name="format_data_wtc2">backups and media. This cannot be undone.</string>
+ <string name="format_data_undo">This cannot be undone.</string>
+ <string name="format_data_complete">Data Format Complete</string>
+ <string name="yes_continue">Type yes to continue. Press back to cancel.</string>
+ <string name="part_opt_hdr">Partition Options for: %tw_partition_name%</string>
+ <string name="sel_act_hdr">Select Action</string>
+ <string name="file_sys_opt">File System Options</string>
+ <string name="partition">Partition: %tw_partition_name%</string>
+ <string name="part_mount_point">Mount Point: %tw_partition_mount_point%</string>
+ <string name="part_curr_fs">File system: %tw_partition_file_system%</string>
+ <string name="part_present_yes">Present: Yes</string>
+ <string name="part_present_no">Present: No</string>
+ <string name="part_removable_yes">Removable: Yes</string>
+ <string name="part_removable_no">Removable: No</string>
+ <string name="part_size">Size: %tw_partition_size%MB</string>
+ <string name="part_used">Used: %tw_partition_used%MB</string>
+ <string name="part_free">Free: %tw_partition_free%MB</string>
+ <string name="part_backup_size">Backup Size: %tw_partition_backup_size%MB</string>
+ <string name="resize_btn">Resize File System</string>
+ <string name="resize_btn_s">Resize</string>
+ <string name="resize_confirm">Resize %tw_partition_name%?</string>
+ <string name="resizing">Resizing...</string>
+ <string name="resize_complete">Resize Complete</string>
+ <string name="swipe_resize">Swipe to Resize</string>
+ <string name="swipe_resize_s"> Resize</string>
+ <string name="repair_btn">Repair File System</string>
+ <string name="repair_btn_s">Repair</string>
+ <string name="repair_confirm">Repair %tw_partition_name%?</string>
+ <string name="repairing">Repairing...</string>
+ <string name="repair_complete">Repair Complete</string>
+ <string name="swipe_repair">Swipe to Repair</string>
+ <string name="swipe_repair_s"> Repair</string>
+ <string name="change_fs_btn">Change File System</string>
+ <string name="change_fs_btn_s">Change</string>
+ <string name="change_fs_for_hdr">Change File System for: %tw_partition_name%</string>
+ <string name="change_fs_for_hdr_s">Partition: %tw_partition_name% > Select File System</string>
+ <string name="change_fs_warn1">Some ROMs or kernels may not support some</string>
+ <string name="change_fs_warn2">file systems. Proceed with caution!</string>
+ <string name="change_fs_confirm">Change %tw_partition_name%?</string>
+ <string name="formatting">Formatting...</string>
+ <string name="format_complete">Format Complete</string>
+ <string name="swipe_change_fs">Swipe to Change</string>
+ <string name="swipe_change_s"> Change</string>
+ <string name="back_btn">Back</string>
+ <string name="wipe_enc_btn">Wipe Encryption</string>
+ <string name="swipe_factory_reset">Swipe to Factory Reset</string>
+ <string name="repair_change_btn">Repair or Change File System</string>
+ <string name="storage_hdr">Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="backup_hdr">Backup</string>
+ <string name="backup_confirm_hdr">Confirm Backup</string>
+ <string name="encryption_tab">ENCRYPTION</string>
+ <string name="encryption">Encryption:</string>
+ <string name="name">Name:</string>
+ <string name="sel_part_backup">Select Partitions to Backup:</string>
+ <string name="storage">Storage:</string>
+ <string name="enc_disabled">disabled - set a password to enable</string>
+ <string name="enc_enabled">enabled</string>
+ <string name="enable_backup_comp_chk">Enable compression</string>
+ <string name="skip_md5_backup_chk">Skip MD5 generation during backup</string>
+ <string name="disable_backup_space_chk">Disable Free Space Check</string>
+ <string name="refresh_sizes_btn">Refresh Sizes</string>
+ <string name="swipe_backup">Swipe to Backup</string>
+ <string name="append_date_btn">Append Date</string>
+ <string name="backup_name_exists">A backup with that name already exists!</string>
+ <string name="encrypt_backup">Encrypt your Backup?</string>
+ <string name="enter_pass">Enter Password:</string>
+ <string name="enter_pass2">Enter Password Again:</string>
+ <string name="pass_not_match">Passwords do not match!</string>
+ <string name="partitions">Partitions:</string>
+ <string name="disabled">Disabled</string>
+ <string name="enabled">Enabled</string>
+ <string name="backup_name_hdr">Set Backup Name</string>
+ <string name="progress">Progress:</string>
+ <string name="backup_complete">Backup Complete</string>
+ <string name="backup_cancel">Backup Cancelled</string>
+ <string name="restore_hdr">Restore</string>
+ <string name="sel_backup_hdr">Select Backup</string>
+ <string name="restore_sel_store_hdr">Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)</string>
+ <string name="restore_sel_pack_fs">Select Package to Restore:</string>
+ <string name="restore_enc_backup_hdr">Encrypted Backup</string>
+ <string name="restore_dec_fail">Password failed, please try again!</string>
+ <string name="del_backup_btn">Delete Backup</string>
+ <string name="del_backup_confirm">Delete Backup?</string>
+ <string name="del_backup_confirm2">This cannot be undone!</string>
+ <string name="deleting_backup">Deleting Backup...</string>
+ <string name="backup_deleted">Backup Delete Complete</string>
+ <string name="swipe_delete">Swipe to Delete</string>
+ <string name="swipe_delete_s"> Delete</string>
+ <string name="restore_try_decrypt">Encrypted Backup - Trying Decryption</string>
+ <string name="restore_try_decrypt_s">Trying Decryption</string>
+ <string name="restore_backup_date">Backup made on %tw_restore_file_date%</string>
+ <string name="restore_sel_part">Select Partitions to Restore:</string>
+ <string name="retore_enable_md5_chk">Enable MD5 Verification of Backup Files</string>
+ <string name="swipe_restore">Swipe to Restore</string>
+ <string name="swipe_restore_s"> Restore</string>
+ <string name="rename_backup_hdr">Rename Backup</string>
+ <string name="rename_backup_confirm">Rename Backup?</string>
+ <string name="rename_backup_confirm2">This cannot be undone!</string>
+ <string name="renaming_backup">Renaming Backup...</string>
+ <string name="rename_backup_complete">Backup Rename Complete</string>
+ <string name="swipe_to_rename">Swipe to Rename</string>
+ <string name="swipe_rename"> Rename</string>
+ <string name="confirm_hdr">Confirm</string>
+ <string name="mount_hdr">Mount</string>
+ <string name="mount_sel_part"></string>
+ <string name="mount_sel_part">Select Partitions to Mount:</string>
+ <string name="mount_sys_ro_chk">Mount system partition read-only</string>
+ <string name="mount_sys_ro_s_chk">Mount System RO</string>
+ <string name="decrypt_data_btn">Decrypt Data</string>
+ <string name="disable_mtp_btn">Disable MTP</string>
+ <string name="enable_mtp_btn">Enable MTP</string>
+ <string name="mount_usb_storage_btn">Mount USB Storage</string>
+ <string name="usb_storage_hdr">USB Storage</string>
+ <string name="usb_stor_mnt1">USB Storage Mounted</string>
+ <string name="usb_stor_mnt2">Be sure to safely remove your device</string>
+ <string name="usb_stor_mnt3">from your computer before unmounting!</string>
+ <string name="unmount_btn">Unmount</string>
+ <string name="reboot_hdr">Reboot Menu</string>
+ <string name="rb_system_btn">System</string>
+ <string name="rb_poweroff_btn">Power Off</string>
+ <string name="rb_recovery_btn">Recovery</string>
+ <string name="rb_bootloader_btn">Bootloader</string>
+ <string name="rb_download_btn">Download</string>
+ <string name="turning_off">Turning Off...</string>
+ <string name="swipe_power_off">Swipe to Power Off</string>
+ <string name="swipe_power_off_s">Power Off</string>
+ <string name="sys_ro_hdr">Unmodified System Partition</string>
+ <string name="sys_ro_keep">Keep System Read only?</string>
+ <string name="sys_rop1">TWRP can leave your system partition unmodified</string>
+ <string name="sys_rop2">to make it easier for you to take official updates.</string>
+ <string name="sys_rop3">TWRP will be unable to prevent the stock ROM from</string>
+ <string name="sys_rop4">replacing TWRP and will not offer to root your device.</string>
+ <string name="sys_rop5">Installing zips or performing adb operations may still</string>
+ <string name="sys_rop6">modify the system partition.</string>
+ <string name="sys_rol1">TWRP can leave your system partition unmodified to make it easier for you to take official updates.</string>
+ <string name="sys_rol2">TWRP will be unable to prevent the stock ROM from replacing TWRP and will not offer to root your device.</string>
+ <string name="sys_rol3">Installing zips or performing adb operations may still modify the system partition.</string>
+ <string name="sys_ro_never_show_chk">Never show this screen during boot again</string>
+ <string name="sys_ro_keep_ro_btn">Keep Read Only</string>
+ <string name="swipe_allow_mod">Swipe to Allow Modifications</string>
+ <string name="swipe_allow_mod_s">Allow Modifications</string>
+ <string name="settings_hdr">Settings</string>
+ <string name="settings_gen_hdr">General Settings</string>
+ <string name="settings_gen_s_hdr">General</string>
+ <string name="settings_gen_btn">General</string>
+ <string name="use_rmrf_chk">Use rm -rf instead of formatting</string>
+ <string name="use24clock_chk">Use 24-hour clock</string>
+ <string name="rev_navbar_chk">Reversed navbar layout</string>
+ <string name="simact_chk">Simulate actions for theme testing</string>
+ <string name="simfail_chk">Simulate failure for actions</string>
+ <string name="ctr_navbar_rdo">Center navbar buttons</string>
+ <string name="lft_navbar_rdo">Left align navbar buttons</string>
+ <string name="rht_navbar_rdo">Right align navbar buttons</string>
+ <string name="restore_defaults_btn">Restore Defaults</string>
+ <string name="settings_tz_btn">Time Zone</string>
+ <string name="settings_screen_btn">Screen</string>
+ <string name="settings_screen_bright_btn">Screen Brightness</string>
+ <string name="settings_vibration_btn">Vibration</string>
+ <string name="settings_language_btn">Language</string>
+ <string name="time_zone_hdr">Time Zone</string>
+ <string name="sel_tz_list">Select Time Zone:</string>
+ <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense,
+ feel free to change the location listed or drop the location entirely and just call it UTC -6 -->
+ <string name="utcm11">(UTC -11) Samoa, Midway Island</string>
+ <string name="utcm10">(UTC -10) Hawaii</string>
+ <string name="utcm9">(UTC -9) Alaska</string>
+ <string name="utcm8">(UTC -8) Pacific Time</string>
+ <string name="utcm7">(UTC -7) Mountain Time</string>
+ <string name="utcm6">(UTC -6) Central Time</string>
+ <string name="utcm5">(UTC -5) Eastern Time</string>
+ <string name="utcm4">(UTC -4) Atlantic Time</string>
+ <string name="utcm3">(UTC -3) Brazil, Buenos Aires</string>
+ <string name="utcm2">(UTC -2) Mid-Atlantic</string>
+ <string name="utcm1">(UTC -1) Azores, Cape Verde</string>
+ <string name="utc0">(UTC 0) London, Dublin, Lisbon</string>
+ <string name="utcp1">(UTC +1) Berlin, Brussels, Paris</string>
+ <string name="utcp2">(UTC +2) Athens, Istanbul, South Africa</string>
+ <string name="utcp3">(UTC +3) Moscow, Baghdad</string>
+ <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string>
+ <string name="utcp5">(UTC +5) Yekaterinburg, Islamabad</string>
+ <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string>
+ <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string>
+ <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string>
+ <string name="utcp9">(UTC +9) Tokyo, Seoul, Yakutsk</string>
+ <string name="utcp10">(UTC +10) Eastern Australia, Guam</string>
+ <string name="utcp11">(UTC +11) Vladivostok, Solomon Islands</string>
+ <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string>
+ <string name="sel_tz_offset">Select Offset (usually 0): %tw_time_zone_guioffset%</string>
+ <string name="tz_offset_none">None</string>
+ <string name="tz_offset_0">0</string>
+ <string name="tz_offset_15">15</string>
+ <string name="tz_offset_30">30</string>
+ <string name="tz_offset_45">45</string>
+ <string name="use_dst_chk">Use daylight savings time (DST)</string>
+ <string name="curr_tz">Current Time Zone: %tw_time_zone%</string>
+ <string name="curr_tz_s">Current Time Zone:</string>
+ <string name="set_tz_btn">Set Time Zone</string>
+ <string name="settings_screen_hdr">Screen Settings</string>
+ <string name="settings_screen_timeout_hdr">Screen Timeout</string>
+ <string name="enable_timeout_chk">Enable screen timeout</string>
+ <string name="screen_to_slider">Screen timeout in seconds:</string>
+ <string name="screen_to_slider_s">Screen timeout in seconds (0=disabled): %tw_screen_timeout_secs%</string>
+ <string name="screen_to_na">Screen timeout setting unavailable</string>
+ <string name="screen_bright_slider">Brightness: %tw_brightness_pct%%</string>
+ <string name="screen_bright_na">Brightness setting unavailable</string>
+ <string name="vibration_hdr">Vibration</string>
+ <string name="button_vibration_hdr">Button Vibration</string>
+ <string name="kb_vibration_hdr">Keyboard Vibration</string>
+ <string name="act_vibration_hdr">Action Vibration</string>
+ <string name="button_vibration">Button Vibration:</string>
+ <string name="kb_vibration">Keyboard Vibration:</string>
+ <string name="act_vibration">Action Vibration:</string>
+ <string name="select_language">Select Language:</string>
+ <string name="set_language_btn">Set Language</string>
+ <string name="advanced_hdr">Advanced</string>
+ <string name="copy_log_confirm">Copy Log to SD Card?</string>
+ <string name="copying_log">Copying Log to SD Card...</string>
+ <string name="copy_log_complete">Log Copy Complete</string>
+ <string name="fix_perm_btn">Fix Permissions</string>
+ <string name="fix_perm_s_btn">Fix Perms</string>
+ <string name="part_sd_btn">Partition SD Card</string>
+ <string name="part_sd_s_btn">SD Card</string>
+ <string name="file_manager_btn">File Manager</string>
+ <string name="language_hdr">Language</string>
+ <string name="terminal_btn">Terminal</string>
+ <string name="reload_theme_btn">Reload Theme</string>
+ <string name="dumlock_btn">HTC Dumlock</string>
+ <string name="inject_twrp_btn">Inject TWRP</string>
+ <string name="inject_twrp_confirm">Re-Inject TWRP?</string>
+ <string name="injecting_twrp">Re-Injecting TWRP...</string>
+ <string name="inject_twrp_complete">TWRP Injection Complete</string>
+ <string name="swipe_to_confirm">Swipe to Confirm</string>
+ <string name="part_sd_hdr">Partition SD Card</string>
+ <string name="part_sd_lose">You will lose all files on your SD card!</string>
+ <string name="part_sd_undo">This action cannot be undone!</string>
+ <string name="part_sd_ext_sz">EXT Size:</string>
+ <string name="part_sd_swap_sz">Swap Size:</string>
+ <string name="part_sd_m">-</string>
+ <string name="part_sd_p">+</string>
+ <string name="file_system">File System:</string>
+ <string name="swipe_part_sd">Swipe to Partition</string>
+ <string name="swipe_part_sd_s">Partition</string>
+ <string name="partitioning_sd">Partitioning SD Card...</string>
+ <string name="partitioning_sd2">This will take a few minutes.</string>
+ <string name="part_sd_complete">Partitioning Complete</string>
+ <string name="dumlock_hdr">HTC Dumlock</string>
+ <string name="dumlock_restore_btn">Restore Original Boot</string>
+ <string name="dumlock_restore_confirm">Restore original boot image?</string>
+ <string name="dumlock_restoring">Restoring Original Boot...</string>
+ <string name="dumlock_restore_complete">Restore Original Boot Complete</string>
+ <string name="dumlock_reflash_btn">Reflash Recovery</string>
+ <string name="dumlock_reflash_confirm">Reflash recovery to boot?</string>
+ <string name="dumlock_reflashing">Flashing recovery to boot...</string>
+ <string name="dumlock_reflash_complete">Recovery Flash to Boot Complete</string>
+ <string name="dumlock_install_btn">Install HTC Dumlock</string>
+ <string name="dumlock_install_confirm">Install HTC dumlock files to ROM?</string>
+ <string name="dumlock_installing">Installing HTC Dumlock...</string>
+ <string name="dumlock_install_complete">HTC Dumlock Install Complete</string>
+ <string name="swipe_to_unlock">Swipe to Unlock</string>
+ <string name="swipe_unlock"> Unlock</string>
+ <string name="fm_hdr">File Manager</string>
+ <string name="fm_sel_file">Select a File or Folder</string>
+ <string name="fm_type_folder">Folder</string>
+ <string name="fm_type_file">File</string>
+ <string name="fm_choose_act">Choose Action</string>
+ <string name="fm_selected">%tw_fm_type% selected:</string>
+ <string name="fm_copy_btn">Copy</string>
+ <string name="fm_copy_file_btn">Copy File</string>
+ <string name="fm_copy_folder_btn">Copy Folder</string>
+ <string name="fm_copying">Copying</string>
+ <string name="fm_move_btn">Move</string>
+ <string name="fm_moving">Moving</string>
+ <string name="fm_chmod755_btn">chmod 755</string>
+ <string name="fm_chmod755ing">chmod 755</string>
+ <string name="fm_chmod_btn">chmod</string>
+ <string name="fm_delete_btn">Delete</string>
+ <string name="fm_deleting">Deleting</string>
+ <string name="fm_rename_btn">Rename</string>
+ <string name="fm_rename_file_btn">Rename File</string>
+ <string name="fm_rename_folder_btn">Rename Folder</string>
+ <string name="fm_renaming">Renaming</string>
+ <string name="fm_sel_dest">Select Destination Folder</string>
+ <string name="fm_sel_curr_folder">Select Current Folder</string>
+ <string name="fm_rename_hdr">Rename</string>
+ <string name="fm_set_perms_hdr">Set Permissions</string>
+ <string name="fm_perms">Permissions:</string>
+ <string name="fm_complete">File Operation Complete</string>
+ <string name="decrypt_data_hdr">Decrypt Data</string>
+ <string name="decrypt_data_enter_pass"></string>
+ <string name="decryt_data_failed">Password failed, please try again!</string>
+ <string name="decrypt_data_enter_pattern">Enter Pattern.</string>
+ <string name="decrypt_data_trying">Trying Decryption</string>
+ <string name="term_hdr">Terminal Command</string>
+ <string name="term_s_hdr">Terminal</string>
+ <string name="term_kill_btn">KILL</string>
+ <string name="term_sel_folder_hdr">Browse to Starting Folder</string>
+ <string name="adb_sideload_hdr">ADB Sideload</string>
+ <string name="sideload_wipe_dalvik_chk">Wipe Dalvik Cache</string>
+ <string name="sideload_wipe_cache_chk">Wipe Cache</string>
+ <string name="swipe_to_sideload">Swipe to Start Sideload</string>
+ <string name="swipe_sideload"> Start</string>
+ <string name="sideload_confirm">ADB Sideload</string>
+ <string name="sideload_usage">Usage: adb sideload filename.zip</string>
+ <string name="sideload_complete">ADB Sideload Complete</string>
+ <string name="fix_perms_hdr">Fix Permissions</string>
+ <string name="fix_perms_note">Note: Fixing permissions is rarely needed.</string>
+ <string name="fix_perms_selinux_chk">Also fix SELinux Contexts</string>
+ <string name="fix_perms_sel_note1">Fixing SELinux Contexts may cause</string>
+ <string name="fix_perms_sel_note2">your device to not boot properly.</string>
+ <string name="swipe_to_fix_perms">Swipe to Fix Permissions</string>
+ <string name="swipe_fix_perms"> Fix Perms</string>
+ <string name="fixing_perms">Fixing Permissions...</string>
+ <string name="fix_perms_complete">Fix Permissions Complete</string>
+ <string name="reboot_hdr">Reboot</string>
+ <string name="su_hdr">SuperSU Check</string>
+ <string name="su_note1">Your device does not appear to be rooted.</string>
+ <string name="su_note2">Install SuperSU now?</string>
+ <string name="su_note3">This will root your device.</string>
+ <string name="su_cancel">Do Not Install</string>
+ <string name="swipe_su_to_install">Swipe to Install</string>
+ <string name="swipe_su_install"> Install</string>
+ <string name="su_installing">Installing SuperSU</string>
+ <string name="sel_storage_list">Select Storage</string>
+ <string name="ok_btn">OK</string>
+
+ <!-- Various console messages - these consist of user displayed messages, oftentimes errors -->
+ <string name="no_kernel_selinux">Kernel does not have support for reading SELinux contexts.</string>
+ <string name="full_selinux">Full SELinux support is present.</string>
+ <string name="no_selinux">No SELinux support (no libselinux).</string>
+ <string name="mtp_enabled">MTP Enabled</string>
+ <string name="mtp_crash">MTP Crashed, not starting MTP on boot.</string>
+ <string name="rebooting">Rebooting...</string>
+ <string name="decrypt_success">Successfully decrypted with default password.</string>
+ <string name="unable_to_decrypt">Unable to decrypt with default password. You may need to perform a Format Data.</string>
+ <string name="generating_md51">Generating MD5</string>
+ <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text -->
+ <string name="generating_md52"> * Generating md5...</string>
+ <string name="md5_created"> * MD5 Created.</string>
+ <string name="md5_error"> * MD5 Error!</string>
+ <string name="md5_compute_error"> * Error computing MD5.</string>
+ <string name="md5_created"> * MD5 Created.</string>
+ <string name="current_date">(Current Date)</string>
+ <string name="auto_generate">(Auto Generate)</string>
+ <string name="unable_to_locate_partition">Unable to locate '{1}' partition for backup calculations.</string>
+ <string name="no_partition_selected">No partitions selected for backup.</string>
+ <string name="total_partitions_backup"> * Total number of partitions to back up: {1}</string>
+ <string name="total_backup_size"> * Total size of all data: {1}MB</string>
+ <string name="available_space"> * Available space: {1}MB</string>
+ <string name="unable_locate_storage">Unable to locate storage device.</string>
+ <string name="Not enough free space on storage.">Not enough free space on storage.</string>
+ <string name="backup_started">[BACKUP STARTED]</string>
+ <string name="backup_folder"> * Backup Folder: {1}</string>
+ <string name="fail_backup_folder">Failed to make backup folder.</string>
+ <string name="avg_backup_fs">Average backup rate for file systems: {1} MB/sec</string>
+ <string name="avg_backup_img">Average backup rate for imaged drives: {1} MB/sec</string>
+ <string name="total_backed_size">[{1} MB TOTAL BACKED UP]</string>
+ <string name="backup_completed">[BACKUP COMPLETED IN {1} SECONDS]</string>
+ <string name="restore_started">[RESTORE STARTED]</string>
+ <string name="restore_folder">Restore folder: '{1}'</string>
+ <!-- {1} is the partition display name and {2} is the number of seconds -->
+ <string name="restort_part_done">[{1} done ({2} seconds)]</string>
+ <string name="verifying_md5">Verifying MD5</string>
+ <string name="skip_md5">Skipping MD5 check based on user setting.</string>
+ <string name="calc_restore">Calculating restore details...</string>
+ <string name="restore_read_only">Cannot restore {1} -- mounted read only.</string>
+ <string name="restore_unable_locate">Unable to locate '{1}' partition for restoring.</string>
+ <string name="no_part_restore">No partitions selected for restore.</string>
+ <string name="restore_part_count">Restoring {1} partitions...</string>
+ <string name="total_restore_size">Total restore size is {1}MB</string>
+ <string name="updating_system_details">Updating System Details</string>
+ <string name="restore_complete">[RESTORE COMPLETED IN {1} SECONDS]</string>
+ <!-- {1} is the path we could not open, {2} is strerror output -->
+ <string name="error_opening_strerr">Error opening: '{1}' ({2})</string>
+ <string name="unable_locate_part_backup_name">Unable to locate partition by backup name: '{1}'</string>
+ <string name="unable_find_part_path">Unable to find partition for path '{1}'</string>
+ <string name="update_part_details">Updating partition details...</string>
+ <string name="update_part_details_done">...done</string>
+ <string name="wiping_dalvik">Wiping Dalvik Cache Directories...</string>
+ <string name="cleaned">Cleaned: {1}...</string>
+ <string name="dalvik_done">-- Dalvik Cache Directories Wipe Complete!</string>
+ <string name="no_andsec">No android secure partitions found.</string>
+ <string name="unable_to_locate">Unable to locate {1}.</string>
+ <string name="wiping_datamedia">Wiping internal storage -- /data/media...</string>
+ <string name="unable_to_mount">Unable to mount {1}</string>
+ <string name="unable_to_mount_internal">Unable to mount internal_storage</string>
+ <string name="unable_to_mount_storage">Unable to mount storage</string>
+ <string name="fail_decrypt">Failed to decrypt data.</string>
+ <string name="no_crypto_support">No crypto support was compiled into this build.</string>
+ <string name="decrypt_success">Data successfully decrypted, new block device: '{1}'</string>
+ <string name="done">Done.</string>
+ <string name="start_partition_sd">Partitioning SD Card...</string>
+ <string name="partition_sd_locate">Unable to locate device to partition.</string>
+ <string name="ext_swap_size">EXT + Swap size is larger than sdcard size.</string>
+ <string name="remove_part_table">Removing partition table...</string>
+ <string name="unable_rm_part">Unable to remove partition table.</string>
+ <string name="create_part">Creating {1} partition...</string>
+ <string name="unable_to_create_part">Unable to create {1} partition.</string>
+ <string name="format_sdext_as">Formatting sd-ext as {1}...</string>
+ <string name="part_complete">Partitioning complete.</string>
+ <string name="unable_to_open">Unable to open '{1}'.</string>
+ <string name="mtp_already_enabled">MTP already enabled</string>
+ <string name="mtp_fail">Failed to enable MTP</string>
+ <string name="no_mtp">MTP support not included</string>
+ <string name="image_flash_start">[IMAGE FLASH STARTED]</string>
+ <string name="img_to_flash">Image to flash: '{1}'</string>
+ <string name="flash_unable_locate">Unable to locate '{1}' partition for flashing.</string>
+ <string name="no_part_flash">No partitions selected for flashing.</string>
+ <string name="too_many_flash">Too many partitions selected for flashing.</string>
+ <string name="invalid_flash">Invalid flash partition specified.</string>
+ <string name="flash_done">[IMAGE FLASH COMPLETED]</string>
+ <string name="wiping">Wiping {1}</string>
+ <string name="repair_not_exist">{1} does not exist! Cannot repair!</string>
+ <string name="unable_repair">Unable to repair {1}.</string>
+ <string name="mount_data_footer">Could not mount /data and unable to find crypto footer.</string>
+ <!-- {1} is the folder name that we could not create, {2} is strerror output -->
+ <string name="create_folder_strerr">Can not create '{1}' folder ({2}).</string>
+ <!-- {1} is the folder name that we could not mount, {2} is strerror output -->
+ <string name="fail_mount">Failed to mount '{1}' ({2})</string>
+ <!-- {1} is the folder name that we could not unmount, {2} is strerror output -->
+ <string name="fail_mount">Failed to unmount '{1}' ({2})</string>
+ <string name="cannot_resize">Cannot resize {1}.</string>
+ <string name="repair_resize">Repairing {1} before resizing.</string>
+ <string name="unable_resize">Unable to resize {1}.</string>
+ <string name="no_md5_found">No md5 file found for '{1}'. Please unselect Enable MD5 verification to restore.</string>
+ <string name="md5_fail_match">MD5 failed to match on '{1}'.</string>
+ <string name="restoring">Restoring</string>
+ <string name="format_data_msg">You may need to reboot recovery to be able to use /data again.</string>
+ <string name="format_data_err">Unable to format to remove encryption.</string>
+ <string name="formating_using">Formatting {1} using {2}...</string>
+ <string name="unable_to_wipe">Unable to wipe {1}.</string>
+ <string name="remove_all">Removing all files under '{1}'</string>
+ <string name="wiping_data">Wiping data without wiping /data/media ...</string>
+ <string name="backing_up">Backing up {1}...</string>
+ <string name="backing">Backing Up</string>
+ <string name="backup_size">Backup file size for '{1}' is 0 bytes.</string>
+ <string name="datamedia_fs_restore">WARNING: This /data backup was made with {1} file system! The backup may not boot unless you change back to {1}.</string>
+ <string name="restoring">Restoring {1}...</string>
+ <string name="restore">Restoring</string>
+ <string name="recreate_folder_err">Unable to recreate {1} folder.</string>
+ <string name="img_size_err">Size of image is larger than target device</string>
+ <string name="flashing">Flashing {1}...</string>
+ <string name="backup_folder">Backup folder set to '{1}'</string>
+ <string name="locate_backup_err">Unable to locate backup '{1}'</string>
+ <string name="set_restore_opt">Setting restore options: '{1}':</string>
+ <string name="md5_check_skip">MD5 check skip is on</string>
+ <string name="ors_encrypt_restore_err">Unable to use OpenRecoveryScript to restore an encrypted backup.</string>
+ <string name="mounting">Mounting</string>
+ <string name="unmounting">Unmounting</string>
+ <string name="mounted">Mounted '{1}'</string>
+ <string name="unmounted">Unmounted '{1}'</string>
+ <string name="setting">Setting '{1}' to '{2}'</string>
+ <string name="setting_empty">Setting '{1}' to empty</string>
+ <string name="making_dir1">Making Directory</string>
+ <string name="making_dir2">Making directory: '{1}'</string>
+ <string name="running_command">Running Command</string>
+ <string name="sideload">ADB Sideload</string>
+ <string name="start_sideload">Starting ADB sideload feature...</string>
+ <string name="need_new_adb">You need adb 1.0.32 or newer to sideload to this device.</string>
+ <string name="no_pwd">No password provided.</string>
+ <string name="done_ors">Done processing script file</string>
+ <string name="injecttwrp">Injecting TWRP into boot image...</string>
+ <string name="zip_err">Error installing zip file '{1}'</string>
+ <string name="installing_zip">Installing zip file '{1}'</string>
+ <string name="select_backup_opt">Setting backup options:</string>
+ <string name="compression_on">Compression is on</string>
+ <string name="md5_off">MD5 Generation is off</string>
+ <string name="backup_fail">Backup Failed</string>
+ <string name="backup_complete">Backup complete!</string>
+ <string name="running_recovery_commands">Running Recovery Commands</string>
+ <string name="recovery_commands_complete">Recovery Commands Complete</string>
+ <string name="running_ors">Running OpenRecoveryScript</string>
+ <string name="ors_complete">OpenRecoveryScript Complete</string>
+ <string name="no_updater_binary">Could not find '{1}' in the zip file.</string>
+ <string name="check_for_md5">Checking for MD5 file...</string>
+ <string name="fail_sysmap">Failed to map file '{1}'</string>
+ <string name="verify_zip_sig">Verifying zip signature...</string>
+ <string name="verify_zip_fail">Zip signature verification failed!</string>
+ <string name="verify_zip_done">Zip signature verified successfully.</string>
+ <string name="zip_corrupt">Zip file is corrupt!</string>
+ <string name="no_md5">Skipping MD5 check: no MD5 file found</string>
+ <string name="md5_fail">MD5 does not match</string>
+ <string name="md5_match">MD5 matched</string>
+ <string name="pid_signal">{1} process ended with signal: {2}</string>
+ <string name="pid_error">{1} process ended with ERROR: {2}</string>
+ <string name="install_dumlock">Installing HTC Dumlock to system...</string>
+ <string name="dumlock_restore">Restoring original boot...</string>
+ <string name="dumlock_reflash">Reflashing recovery to boot...</string>
+ <string name="run_script">Running {1} script...</string>
+ <string name="rename_stock">Renamed stock recovery file in /system to prevent the stock ROM from replacing TWRP.</string>
+ <string name="split_backup">Breaking backup file into multiple archives...</string>
+ <string name="backup_error">Error creating backup.</string>
+ <string name="restore_error">Error during restore process.</string>
+ <string name="split_thread">Splitting thread ID {1} into archive {2}</string>
+ <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} -->
+ <string name="file_progress">%llu of %llu files, %i%%</string>
+ <string name="size_progress">%lluMB of %lluMB, %i%%</string>
+ <string name="decrypt_cmd">Attempting to decrypt data partition via command line.</string>
+ <string name="base_pkg_err">Failed to load base packages.</string>
+ <string name="simulating">Simulating actions...</string>
+ <string name="backup_cancel">Backup Canceled.</string>
+ <string name="config_twrp">Configuring TWRP...</string>
+ <string name="config_twrp_err">Unable to configure TWRP with this kernel.</string>
+ <string name="copy_log">Copied recovery log to {1}.</string>
+ <string name="max_queue">Maximum zip queue reached!</string>
+ <string name="min_queue">Minimum zip queue reached!</string>
+ <string name="screenshot_err">Failed to take a screenshot!</string>
+ <string name="zip_wipe_cache">One or more zip requested a cache wipe -- Wiping cache now.</string>
+ <string name="and_sec_wipe_err">Unable to wipe android secure</string>
+ <string name="dalvik_wipe_err">Failed to wipe dalvik</string>
+ <string name="auto_gen">(Auto Generate)</string>
+ <string name="curr_date">(Current Date)</string>
+ <string name="backup_name_len">Backup name is too long.</string>
+ <string name="backup_name_invalid">Backup name '{1}' contains invalid character: '{1}'</string>
+ <string name="backup_name_exists">A backup with this name already exists.</string>
+ <string name="no_real_sdcard">This device does not have a real SD Card! Aborting!</string>
+ <string name="cancel_sideload">Cancelling ADB sideload...</string>
+ <string name="change_fs_err">Error changing file system.</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/es.xml b/gui/theme/common/languages/es.xml
new file mode 100644
index 0000000..ec2b41d
--- /dev/null
+++ b/gui/theme/common/languages/es.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Español</display>
+
+ <resources>
+ <resource name="font" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="mediumfont" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="filelist" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+ <string name="install_btn">Instalar</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/languages/fi.xml b/gui/theme/common/languages/fi.xml
new file mode 100644
index 0000000..51ed60d
--- /dev/null
+++ b/gui/theme/common/languages/fi.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<language>
+ <display>Suomi</display>
+
+ <resources>
+ <resource name="font" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="mediumfont" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="filelist" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" />
+ <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" />
+ <string name="install_btn">Asenna</string>
+ </resources>
+</language>
diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml
old mode 100644
new mode 100755
index dc9bea2..2cd49e4
--- a/gui/theme/common/portrait.xml
+++ b/gui/theme/common/portrait.xml
@@ -158,7 +158,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Team Win Recovery Project</text>
+ <text>{@twrp_header=Team Win Recovery Project}</text>
</text>
<text style="text_m">
@@ -169,7 +169,7 @@
<button style="main_button">
<placement x="%indent%" y="%row2a_y%"/>
- <text>Install</text>
+ <text>{@install_btn=Install}</text>
<actions>
<action function="queueclear"/>
<action function="set">tw_selectimage=0</action>
@@ -179,43 +179,43 @@
<button style="main_button">
<placement x="%center_x%" y="%row2a_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_btn=Wipe}</text>
<action function="page">wipe</action>
</button>
<button style="main_button">
<placement x="%indent%" y="%row8_y%"/>
- <text>Backup</text>
+ <text>{@backup_btn=Backup}</text>
<action function="page">backup</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row8_y%"/>
- <text>Restore</text>
+ <text>{@restore_btn=Restore}</text>
<action function="page">restore</action>
</button>
<button style="main_button">
<placement x="%indent%" y="%row13a_y%"/>
- <text>Mount</text>
+ <text>{@mount_btn=Mount}</text>
<action function="page">mount</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row13a_y%"/>
- <text>Settings</text>
+ <text>{@settings_btn=Settings}</text>
<action function="page">settings</action>
</button>
<button style="main_button">
<placement x="%indent%" y="%row19_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_btn=Advanced}</text>
<action function="page">advanced</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row19_y%"/>
- <text>Reboot</text>
+ <text>{@reboot_btn=Reboot}</text>
<action function="page">reboot</action>
</button>
</page>
@@ -226,18 +226,18 @@
<text style="text_l">
<condition var1="tw_selectimage" var2="0"/>
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_hdr=Install Zip}</text>
</text>
<text style="text_l">
<condition var1="tw_selectimage" var2="1"/>
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Image</text>
+ <text>{@install_image_hdr=Install Image}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@select_file_from_storage=Select File from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="sort_options"/>
@@ -264,7 +264,7 @@
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=install</action>
<action function="overlay">select_storage</action>
@@ -274,7 +274,7 @@
<button style="main_button_half_height">
<condition var1="tw_selectimage" var2="0"/>
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Install Image</text>
+ <text>{@install_image_btn=Install Image}</text>
<actions>
<action function="set">tw_selectimage=1</action>
<action function="page">install</action>
@@ -284,7 +284,7 @@
<button style="main_button_half_height">
<condition var1="tw_selectimage" var2="1"/>
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_btn=Install Zip}</text>
<actions>
<action function="set">tw_selectimage=0</action>
<action function="page">install</action>
@@ -326,32 +326,32 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_hdr=Install Zip}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>%tw_zip_queue_count% of max of 10 Files queued</text>
+ <text>{@zip_queue_count=%tw_zip_queue_count% of max of 10 Files queued}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>This operation may install incompatible</text>
+ <text>{@zip_warn1=This operation may install incompatible}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>software and render your device unusable.</text>
+ <text>{@zip_warn2=software and render your device unusable.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Press back to cancel adding this zip.</text>
+ <text>{@zip_back_cancel=Press back to cancel adding this zip.}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row7_y%"/>
- <text>Folder:</text>
+ <text>{@folder=Folder:}</text>
</text>
<text style="text_m">
@@ -361,7 +361,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row9a_y%"/>
- <text>File:</text>
+ <text>{@file=File:}</text>
</text>
<text style="text_m">
@@ -371,26 +371,26 @@
<checkbox>
<placement x="%indent%" y="%row12_y%"/>
- <text>Zip file signature verification</text>
+ <text>{@zip_sig_chk=Zip signature verification}</text>
<data variable="tw_signed_zip_verify"/>
</checkbox>
<checkbox>
<condition var1="tw_has_injecttwrp" var2="1"/>
<placement x="%indent%" y="%row13_y%"/>
- <text>Inject TWRP after install</text>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
<data variable="tw_inject_after_zip"/>
</checkbox>
<button style="main_button_half_height">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Add more Zips</text>
+ <text>{@zip_add_btn=Add more Zips}</text>
<action function="page">install</action>
</button>
<button style="main_button_half_height">
<placement x="%center_x%" y="%row18a_y%"/>
- <text>Clear Zip Queue</text>
+ <text>{@zip_clear_btn=Clear Zip Queue}</text>
<actions>
<action function="queueclear"/>
<action function="page">install</action>
@@ -398,7 +398,7 @@
</button>
<slider>
- <text>Swipe to confirm Flash</text>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
<action function="flash">flash_zip</action>
</slider>
@@ -421,7 +421,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip %tw_zip_index% of %tw_zip_queue_count%</text>
+ <text>{@install_zip_count_hdr=Install Zip %tw_zip_index% of %tw_zip_queue_count%}</text>
</text>
<text style="text_m">
@@ -444,26 +444,26 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_hdr=Install Zip}</text>
</text>
<text style="text_m_fail">
<condition var1="tw_operation_status" op="!=" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Failed</text>
+ <text>{@failed=Failed}</text>
</text>
<text style="text_m">
<condition var1="tw_operation_status" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Successful</text>
+ <text>{@successful=Successful}</text>
</text>
<template name="console"/>
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Wipe cache/dalvik</text>
+ <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
<actions>
<action function="set">tw_back=flash_done</action>
<action function="set">tw_action=wipe</action>
@@ -471,30 +471,30 @@
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=wipe</action>
<action function="set">tw_action2_param=dalvik</action>
- <action function="set">tw_text1=Wipe Cache & Dalvik?</action>
- <action function="set">tw_action_text1=Wiping Cache & Dalvik...</action>
- <action function="set">tw_complete_text1=Cache & Dalvik Wipe Complete</action>
- <action function="set">tw_slider_text=Swipe to Wipe</action>
+ <action function="set">tw_text1={@wipe_cache_dalvik_confirm=Wipe Cache & Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Cache & Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_cache_dalvik_complete=Cache & Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe=Swipe to Wipe}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_half_height">
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Reboot System</text>
+ <text>{@reboot_system_btn=Reboot System}</text>
<actions>
<action function="set">tw_back=main2</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
<action function="set">tw_text3=</action>
<action function="set">tw_text4=</action>
- <action function="set">tw_action_text1=Rebooting...</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -521,17 +521,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Install Image</text>
+ <text>{@install_image_hdr=Install Image}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select Target Partition</text>
+ <text>{@install_sel_target=Select Target Partition}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row2_y%"/>
- <text>Folder:</text>
+ <text>{@folder=Folder:}</text>
</text>
<text style="text_m">
@@ -541,7 +541,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row4a_y%"/>
- <text>File:</text>
+ <text>{@file=File:}</text>
</text>
<text style="text_m">
@@ -552,20 +552,20 @@
<partitionlist>
<placement x="%indent%" y="%row7_y%" w="%content_width%" h="%partitionlist_flashimage_height%"/>
<icon selected="radio_true" unselected="radio_false"/>
- <text>Select Partition to Flash Image:</text>
+ <text>{@flash_image_select=Select Partition to Flash Image:}</text>
<data name="tw_flash_partition"/>
<listtype name="flashimg"/>
</partitionlist>
<slider>
- <text>Swipe to confirm Flash</text>
+ <text>{@swipe_flash=Swipe to confirm Flash}</text>
<actions>
<action function="set">tw_back=flashimage_confirm</action>
<action function="set">tw_action=flashimage</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_action_text1=Flashing Image...</action>
+ <action function="set">tw_action_text1={@flashing_image=Flashing Image...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Image Flashed</action>
+ <action function="set">tw_complete_text1={@image_flashed=Image Flashed}</action>
<action function="page">action_page</action>
</actions>
<action function="flashimage"/>
@@ -615,7 +615,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Confirm Action</text>
+ <text>{@confirm_action=Confirm Action}</text>
</text>
<text style="text_m">
@@ -645,7 +645,7 @@
<text style="text_m">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<slider>
@@ -687,7 +687,7 @@
<button style="main_button_half_height">
<condition var1="tw_has_cancel" var2="1"/>
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="%tw_cancel_action%">%tw_cancel_param%</action>
</button>
@@ -765,20 +765,20 @@
<text style="text_m_fail">
<condition var1="tw_operation_status" op="!=" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Failed</text>
+ <text>{@failed=Failed}</text>
</text>
<text style="text_m">
<condition var1="tw_operation_status" var2="0"/>
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Successful</text>
+ <text>{@successful=Successful}</text>
</text>
<template name="console"/>
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Back</text>
+ <text>{@back_btn=Back}</text>
<actions>
<action function="set">tw_clear_destination=%tw_back%</action>
<action function="page">clear_vars</action>
@@ -787,20 +787,20 @@
<button style="main_button_half_height">
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Reboot System</text>
+ <text>{@reboot_system_btn=Reboot System}</text>
<actions>
<action function="set">tw_back=main2</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
<action function="set">tw_text3=</action>
<action function="set">tw_text4=</action>
- <action function="set">tw_action_text1=Rebooting...</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -867,23 +867,23 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Factory Reset</text>
+ <text>{@factory_reset_hdr=Factory Reset}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Wipes Data, Cache, and Dalvik</text>
+ <text>{@factory_reset1=Wipes Data, Cache, and Dalvik}</text>
</text>
<text style="text_m_accent">
<condition var1="tw_has_data_media" var2="1"/>
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>(not including internal storage)</text>
+ <text>{@factory_reset2=(not including internal storage)}</text>
</text>
<text style="text_m_accent">
@@ -892,33 +892,33 @@
<condition var1="fileexists" var2="/and-sec"/>
</conditions>
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Android Secure</text>
+ <text>{@android_secure=Android Secure}</text>
</text>
<text style="text_m_accent">
<condition var1="tw_has_sdext_partition" var2="1"/>
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>SD-EXT</text>
+ <text>{@sdext=SD-EXT}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>Most of the time this is</text>
+ <text>{@factory_reset3=Most of the time this is}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>the only wipe that you need.</text>
+ <text>{@factory_reset4=the only wipe that you need.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row10_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<button style="main_button_half_height">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Advanced Wipe</text>
+ <text>{@advanced_wipe_btn=Advanced Wipe}</text>
<actions>
<action function="set">partitionlisterror=0</action>
<action function="page">advancedwipe</action>
@@ -928,7 +928,7 @@
<button style="main_button_half_height">
<condition var1="tw_has_data_media" var2="1"/>
<placement x="%center_x%" y="%row18a_y%"/>
- <text>Format Data</text>
+ <text>{@format_data_btn=Format Data}</text>
<action function="page">formatdata</action>
</button>
@@ -938,29 +938,29 @@
<condition var1="tw_has_data_media" var2="0"/>
</conditions>
<placement x="%center_x%" y="%row18a_y%"/>
- <text>Wipe Encryption</text>
+ <text>{@wipe_enc_btn=Wipe Encryption}</text>
<actions>
<action function="set">tw_back=wipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=DATAMEDIA</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Wipe Encryption from Data?</action>
+ <action function="set">tw_text1={@wipe_enc_confirm=Wipe Encryption from Data?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting Data...</action>
- <action function="set">tw_complete_text1=Data Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Format Data</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_format_data=Swipe to Format Data}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<slider>
- <text>Swipe to Factory Reset</text>
+ <text>{@swipe_factory_reset=Swipe to Factory Reset}</text>
<actions>
<action function="set">tw_back=wipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=data</action>
- <action function="set">tw_action_text1=Factory Reset...</action>
- <action function="set">tw_complete_text1=Factory Reset Complete</action>
+ <action function="set">tw_action_text1={@factory_resetting=Factory Reset...}</action>
+ <action function="set">tw_complete_text1={@factory_reset_complete=Factory Reset Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -985,17 +985,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Advanced Wipe</text>
+ <text>{@advanced_wipe_hdr=Advanced Wipe}</text>
</text>
<partitionlist>
<placement x="%indent%" y="%row1a_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
- <text>Select Partitions to Wipe:</text>
+ <text>{@sel_part_wipe=Select Partitions to Wipe:}</text>
<data name="tw_wipe_list"/>
<listtype name="wipe"/>
</partitionlist>
@@ -1003,12 +1003,12 @@
<text style="text_m_fail">
<condition var1="partitionlisterror" var2="1"/>
<placement x="%center_x%" y="%row17_y%" placement="5"/>
- <text>Invalid partition selection</text>
+ <text>{@invalid_part_sel=Invalid partition selection}</text>
</text>
<button style="main_button_half_height_full_width">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Repair or Change File System</text>
+ <text>{@repair_change_btn=Repair or Change File System}</text>
<actions>
<action function="checkpartitionlist"/>
<action function="page">checkpartitionlist</action>
@@ -1016,14 +1016,14 @@
</button>
<slider>
- <text>Swipe to Wipe</text>
+ <text>{@swipe_wipe=Swipe to Wipe}</text>
<actions>
<action function="set">tw_back=advancedwipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=LIST</action>
- <action function="set">tw_text1=Wipe Selected Partition(s)?</action>
- <action function="set">tw_action_text1=Wiping Partition(s)...</action>
- <action function="set">tw_complete_text1=Wipe Complete</action>
+ <action function="set">tw_text1={@wipe_sel_confirm=Wipe Selected Partition(s)?}</action>
+ <action function="set">tw_action_text1={@wiping_part=Wiping Partition(s)...}</action>
+ <action function="set">tw_complete_text1={@wipe_complete=Wipe Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -1044,37 +1044,37 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Format Data</text>
+ <text>{@format_data_hdr=Format Data}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Format Data will wipe all of your apps,</text>
+ <text>{@format_data_ptr1=Format Data will wipe all of your apps,}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>backups, pictures, videos, media, and</text>
+ <text>{@format_data_ptr2=backups, pictures, videos, media, and}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>removes encryption on internal storage.</text>
+ <text>{@format_data_ptr3=removes encryption on internal storage.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>This cannot be undone. Press back to cancel.</text>
+ <text>{@format_data_undo=This cannot be undone.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>Type yes to continue.</text>
+ <text>{@yes_continue=Type yes to continue. Press back to cancel.}</text>
</text>
<input>
@@ -1109,8 +1109,8 @@
<action function="set">tw_back=formatdata</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=DATAMEDIA</action>
- <action function="set">tw_action_text1=Formatting Data...</action>
- <action function="set">tw_complete_text1=Data Format Complete</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
<action function="page">action_page</action>
</actions>
</action>
@@ -1146,83 +1146,83 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Partition Options for: %tw_partition_name%</text>
+ <text>{@part_opt_hdr=Partition Options for: %tw_partition_name%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Mount Point: %tw_partition_mount_point%</text>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>Current file system: %tw_partition_file_system%</text>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_is_present" var2="1"/>
<placement x="%indent%" y="%row5_y%"/>
- <text>Present: Yes</text>
+ <text>{@part_present_yes=Present: Yes}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_is_present" var2="0"/>
<placement x="%indent%" y="%row5_y%"/>
- <text>Present: No</text>
+ <text>{@part_present_no=Present: No}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_removable" var2="1"/>
<placement x="%center_x%" y="%row5_y%"/>
- <text>Removable: Yes</text>
+ <text>{@part_removable_yes=Removable: Yes}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_removable" var2="0"/>
<placement x="%center_x%" y="%row5_y%"/>
- <text>Removable: No</text>
+ <text>{@part_removable_no=Removable: No}</text>
</text>
<text style="text_m">
<placement x="%indent%" y="%row7_y%"/>
- <text>Size: %tw_partition_size%MB</text>
+ <text>{@part_size=Size: %tw_partition_size%MB}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row7_y%"/>
- <text>Used: %tw_partition_used%MB</text>
+ <text>{@part_used=Used: %tw_partition_used%MB}</text>
</text>
<text style="text_m">
<placement x="%indent%" y="%row9_y%"/>
- <text>Free: %tw_partition_free%MB</text>
+ <text>{@part_free=Free: %tw_partition_free%MB}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row9_y%"/>
- <text>Backup Size: %tw_partition_backup_size%MB</text>
+ <text>{@part_backup_size=Backup Size: %tw_partition_backup_size%MB}</text>
</text>
<button style="main_button_half_height">
<condition var1="tw_partition_can_resize" op="=" var2="1"/>
<placement x="%indent%" y="%row18a_y%"/>
- <text>Resize File System</text>
+ <text>{@resize_btn=Resize File System}</text>
<actions>
<action function="set">tw_back=partitionoptions</action>
<action function="set">tw_action=resize</action>
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=getpartitiondetails</action>
- <action function="set">tw_text1=Resize %tw_partition_name%?</action>
+ <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Resizing...</action>
- <action function="set">tw_complete_text1=Resize Complete</action>
- <action function="set">tw_slider_text=Swipe to Resize</action>
+ <action function="set">tw_action_text1={@resizing=Resizing...}</action>
+ <action function="set">tw_complete_text1={@resize_complete=Resize Complete}</action>
+ <action function="set">tw_slider_text={@swipe_resize=Swipe to Resize}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1230,24 +1230,24 @@
<button style="main_button_half_height">
<condition var1="tw_partition_can_repair" op="=" var2="1"/>
<placement x="%indent%" y="%row21a_y%"/>
- <text>Repair File System</text>
+ <text>{@repair_btn=Repair File System}</text>
<actions>
<action function="set">tw_back=partitionoptions</action>
<action function="set">tw_action=repair</action>
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Repair %tw_partition_name%?</action>
+ <action function="set">tw_text1={@repair_confirm=Repair %tw_partition_name%?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Repairing...</action>
- <action function="set">tw_complete_text1=Repair Complete</action>
- <action function="set">tw_slider_text=Swipe to Repair</action>
+ <action function="set">tw_action_text1={@repairing=Repairing...}</action>
+ <action function="set">tw_complete_text1={@repair_complete=Repair Complete}</action>
+ <action function="set">tw_slider_text={@swipe_repair=Swipe to Repair}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_half_height">
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Change File System</text>
+ <text>{@change_fs_btn=Change File System}</text>
<action function="page">selectfilesystem</action>
</button>
@@ -1287,32 +1287,32 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_hdr=Wipe}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Change File System for: %tw_partition_name%</text>
+ <text>{@change_fs_for_hdr=Change File System for: %tw_partition_name%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Mount Point: %tw_partition_mount_point%</text>
+ <text>{@part_mount_point=Mount Point: %tw_partition_mount_point%}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>Current file system: %tw_partition_file_system%</text>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Some ROMs or kernels may not support some</text>
+ <text>{@change_fs_warn1=Some ROMs or kernels may not support some}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>file systems. Proceed with caution!</text>
+ <text>{@change_fs_warn2=file systems. Proceed with caution!}</text>
</text>
<button style="main_button_half_height">
@@ -1325,11 +1325,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext2</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT2?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT2</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1344,11 +1344,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext3</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT3?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT3</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1363,11 +1363,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext4</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT4?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT4</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1382,11 +1382,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=vfat</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to FAT?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=FAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1401,11 +1401,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=exfat</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to exFAT?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=exFAT</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1420,11 +1420,11 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=f2fs</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to F2FS?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text=Swipe to Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=F2FS</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_fs=Swipe to Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1445,12 +1445,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="tabs_backup"/>
@@ -1465,7 +1465,7 @@
<condition var1="tw_encrypt_backup" var2="0"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1479,7 +1479,7 @@
<condition var1="tw_encrypt_backup" var2="1"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_success_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1489,7 +1489,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row3a_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<text style="text_m">
@@ -1512,14 +1512,14 @@
<partitionlist>
<placement x="%indent%" y="%row6_y%" w="%content_width%" h="%partitionlist_backup_height%"/>
- <text>Select Partitions to Backup:</text>
+ <text>{@sel_part_backup=Select Partitions to Backup:}</text>
<data name="tw_backup_list"/>
<listtype name="backup"/>
</partitionlist>
<button style="main_button_half_height">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=backup</action>
<action function="overlay">select_storage</action>
@@ -1528,7 +1528,7 @@
<button style="main_button_half_height">
<placement x="%center_x%" y="%row18a_y%"/>
- <text>Refresh Sizes</text>
+ <text>{@refresh_sizes_btn=Refresh Sizes}</text>
<actions>
<action function="refreshsizes"/>
<action function="page">backup</action>
@@ -1536,7 +1536,7 @@
</button>
<slider>
- <text>Swipe to Backup</text>
+ <text>{@swipe_backup=Swipe to Backup}</text>
<action function="page">backup_run</action>
</slider>
@@ -1556,12 +1556,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="tabs_backup"/>
@@ -1576,7 +1576,7 @@
<condition var1="tw_encrypt_backup" var2="0"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1590,7 +1590,7 @@
<condition var1="tw_encrypt_backup" var2="1"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_success_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1600,19 +1600,19 @@
<checkbox>
<placement x="%indent%" y="%row3a_y%"/>
- <text>Enable compression</text>
+ <text>{@enable_backup_comp_chk=Enable compression}</text>
<data variable="tw_use_compression"/>
</checkbox>
<checkbox>
<placement x="%indent%" y="%row5_y%"/>
- <text>Skip MD5 generation during backup</text>
+ <text>{@skip_md5_backup_chk=Skip MD5 generation during backup}</text>
<data variable="tw_skip_md5_generate"/>
</checkbox>
<checkbox>
<placement x="%indent%" y="%row6a_y%"/>
- <text>Disable Free Space Check</text>
+ <text>{@disable_backup_space_chk=Disable Free Space Check}</text>
<data variable="tw_disable_free_space"/>
</checkbox>
@@ -1629,7 +1629,7 @@
<page name="backupname1">
<action>
- <condition var1="tw_backup_name" op="=" var2="(Auto Generate)"/>
+ <condition var1="tw_backup_name" op="=" var2="{@auto_generate=(Auto Generate)}"/>
<action function="generatebackupname"/>
</action>
@@ -1643,12 +1643,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="tabs_backup"/>
@@ -1663,7 +1663,7 @@
<condition var1="tw_encrypt_backup" var2="0"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1677,7 +1677,7 @@
<condition var1="tw_encrypt_backup" var2="1"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_success_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1687,7 +1687,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row3a_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -1715,21 +1715,21 @@
<text style="text_m_fail">
<condition var1="tw_fileexists" var2="1"/>
<placement x="%indent%" y="%row6_y%"/>
- <text>A backup with that name already exists!</text>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
</text>
<button style="main_button_half_height">
<placement x="%indent%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">backup</action>
</actions>
</button>
<button style="main_button_half_height">
<placement x="%center_x%" y="%row10_y%"/>
- <text>Append Date</text>
+ <text>{@append_date_btn=Append Date}</text>
<action function="appenddatetobackupname"/>
</button>
@@ -1738,7 +1738,7 @@
<action>
<touch key="home"/>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">main</action>
</actions>
</action>
@@ -1746,7 +1746,7 @@
<action>
<touch key="back"/>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">backup</action>
</actions>
</action>
@@ -1757,12 +1757,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="tabs_backup"/>
@@ -1773,7 +1773,7 @@
<condition var1="tw_encrypt_backup" var2="0"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1787,7 +1787,7 @@
<condition var1="tw_encrypt_backup" var2="1"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_success_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1801,12 +1801,12 @@
<text style="text_m_accent">
<placement x="%center_x%" y="%row3a_y%" placement="5"/>
- <text>Encrypt your Backup?</text>
+ <text>{@encrypt_backup=Encrypt your Backup?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Enter a Password:</text>
+ <text>{@enter_pass=Enter Password:}</text>
</text>
<input>
@@ -1829,12 +1829,12 @@
<text style="text_m_fail">
<condition var1="tw_password_not_match" var2="1"/>
<placement x="%indent%" y="%row8a_y%"/>
- <text>Passwords do not match!</text>
+ <text>{@pass_not_match=Passwords do not match!}</text>
</text>
<button style="main_button_half_height">
<placement x="%center_x%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_encrypt_backup=0</action>
<action function="set">tw_backup_password=</action>
@@ -1863,12 +1863,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Backup</text>
+ <text>{@backup_hdr=Backup}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="tabs_backup"/>
@@ -1879,7 +1879,7 @@
<condition var1="tw_encrypt_backup" var2="0"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1893,7 +1893,7 @@
<condition var1="tw_encrypt_backup" var2="1"/>
</conditions>
<placement x="%tab3_col3_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%"/>
- <text>ENCRYPTION</text>
+ <text>{@encryption_tab=ENCRYPTION}</text>
<font resource="font_s" color="%text_success_color%"/>
<actions>
<action function="set">tw_password_not_match=0</action>
@@ -1907,12 +1907,12 @@
<text style="text_m_accent">
<placement x="%center_x%" y="%row3a_y%" placement="5"/>
- <text>Encrypt your Backup?</text>
+ <text>{@encrypt_backup=Encrypt your Backup?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Enter Password again:</text>
+ <text>{@enter_pass2=Enter Password again:}</text>
</text>
<input>
@@ -1929,7 +1929,7 @@
<button style="main_button_half_height">
<placement x="%center_x%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_encrypt_backup=0</action>
<action function="set">tw_backup_password=</action>
@@ -1995,7 +1995,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row19_y%"/>
- <text>Progress:</text>
+ <text>{@progress=Progress:}</text>
</text>
<text style="text_m">
@@ -2010,7 +2010,7 @@
<button style="main_button_half_height">
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="cancelbackup"/>
</button>
@@ -2023,7 +2023,7 @@
<condition var1="tw_cancel_backup" var2="0"/>
<actions>
<action function="set">tw_back=backup</action>
- <action function="set">tw_complete_text1=Backup Complete</action>
+ <action function="set">tw_complete_text1={@backup_complete=Backup Complete}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -2034,7 +2034,7 @@
<condition var1="tw_cancel_backup" var2="1"/>
<actions>
<action function="set">tw_back=backup</action>
- <action function="set">tw_complete_text1=Backup Cancelled</action>
+ <action function="set">tw_complete_text1={@backup_cancel=Backup Cancelled}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -2046,19 +2046,19 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@restore_sel_store_hdr=Select Backup from %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<template name="sort_options"/>
<fileselector>
<placement x="%indent%" y="%row3_y%" w="%content_width%" h="%fileselector_install_height%"/>
- <text>Select Package to Restore:</text>
+ <text>{@restore_sel_pack_fs=Select Package to Restore:}</text>
<filter folders="1" files="0" nav="0"/>
<path name="tw_backups_folder"/>
<data name="tw_restore" default=""/>
@@ -2067,7 +2067,7 @@
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=restore</action>
<action function="overlay">select_storage</action>
@@ -2115,17 +2115,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Encrypted Backup</text>
+ <text>{@restore_enc_backup_hdr=Encrypted Backup}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Enter Password:</text>
+ <text>{@enter_pass=Enter Password:}</text>
</text>
<input>
@@ -2148,12 +2148,12 @@
<text style="text_m_fail">
<condition var1="tw_password_fail" var2="1"/>
<placement x="%indent%" y="%row5_y%"/>
- <text>Password failed, please try again!</text>
+ <text>{@restore_dec_fail=Password failed, please try again!}</text>
</text>
<button style="main_button_half_height">
<placement x="%indent%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">restore</action>
@@ -2162,16 +2162,17 @@
<button style="main_button_half_height">
<placement x="%center_x%" y="%row10_y%"/>
- <text>Delete Backup</text>
+ <text>{@del_backup_btn=Delete Backup}</text>
<actions>
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && rm -rf "%tw_restore_name%"</action>
- <action function="set">tw_text1=Delete Backup? %tw_restore_name%</action>
- <action function="set">tw_text2=This cannot be undone!</action>
- <action function="set">tw_action_text1=Deleting Backup...</action>
- <action function="set">tw_complete_text1=Backup Delete Complete</action>
- <action function="set">tw_slider_text=Swipe to Delete</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -2194,12 +2195,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Encrypted Backup - Trying Decryption</text>
+ <text>{@restore_try_decrypt=Encrypted Backup - Trying Decryption}</text>
</text>
<template name="console"/>
@@ -2238,17 +2239,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Backup made on %tw_restore_file_date%</text>
+ <text>{@restore_backup_date=Backup made on %tw_restore_file_date%}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<text style="text_m">
@@ -2272,36 +2273,36 @@
<partitionlist>
<placement x="%indent%" y="%row4a_y%" w="%content_width%" h="%partitionlist_backup_height%"/>
- <text>Select Partitions to Restore:</text>
+ <text>{@restore_sel_part=Select Partitions to Restore:}</text>
<data name="tw_restore_list" selectedlist="tw_restore_selected"/>
<listtype name="restore"/>
</partitionlist>
<checkbox>
<placement x="%indent%" y="%row17_y%"/>
- <text>Enable MD5 Verification of Backup Files</text>
+ <text>{@retore_enable_md5_chk=Enable MD5 Verification of Backup Files}</text>
<data variable="tw_skip_md5_check"/>
</checkbox>
<button style="main_button_half_height">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Delete Backup</text>
+ <text>{@del_backup_btn=Delete Backup}</text>
<actions>
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && rm -rf "%tw_restore_name%"</action>
- <action function="set">tw_text1=Delete Backup?</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
<action function="set">tw_text2=%tw_restore_name%</action>
- <action function="set">tw_text4=This cannot be undone!</action>
- <action function="set">tw_action_text1=Deleting Backup...</action>
- <action function="set">tw_complete_text1=Backup Delete Complete</action>
- <action function="set">tw_slider_text=Swipe to Delete</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete=Swipe to Delete}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<slider>
- <text>Swipe to Restore</text>
+ <text>{@swipe_restore=Swipe to Restore}</text>
<action function="page">restore_run</action>
</slider>
@@ -2321,17 +2322,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Rename Backup</text>
+ <text>{@rename_backup_hdr=Rename Backup}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -2343,11 +2344,11 @@
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && mv "%tw_restore_name%" "%tw_backup_rename%"</action>
- <action function="set">tw_text1=Rename Backup?</action>
- <action function="set">tw_text2=This cannot be undone!</action>
- <action function="set">tw_action_text1=Renaming Backup...</action>
- <action function="set">tw_complete_text1=Backup Rename Complete</action>
- <action function="set">tw_slider_text=Swipe to Rename</action>
+ <action function="set">tw_text1={@rename_backup_confirm=Rename Backup?}</action>
+ <action function="set">tw_text2={@rename_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@renaming_backup=Renaming Backup...}</action>
+ <action function="set">tw_complete_text1={@rename_backup_complete=Backup Rename Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_rename=Swipe to Rename}</action>
<action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_rename%</action>
<action function="set">tw_existpage=renamebackup</action>
<action function="set">tw_notexistpage=confirm_action</action>
@@ -2367,12 +2368,12 @@
<text style="text_m_fail">
<condition var1="tw_fileexists" var2="1"/>
<placement x="%indent%" y="%row4a_y%"/>
- <text>A backup with that name already exists!</text>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
</text>
<button style="main_button_half_height">
<placement x="%indent%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">restore_select</action>
</button>
@@ -2394,7 +2395,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Restore</text>
+ <text>{@restore_hdr=Restore}</text>
</text>
<text style="text_m">
@@ -2408,7 +2409,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row19_y%"/>
- <text>Progress:</text>
+ <text>{@progress=Progress:}</text>
</text>
<text style="text_m">
@@ -2420,7 +2421,7 @@
<condition var1="tw_operation_state" var2="1"/>
<actions>
<action function="set">tw_back=restore_select</action>
- <action function="set">tw_complete_text1=Restore Complete</action>
+ <action function="set">tw_complete_text1={@restore_complete=Restore Complete}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -2436,24 +2437,24 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)</text>
+ <text>{@storage_hdr=Storage: %tw_storage_display_name% (%tw_storage_free_size% MB)}</text>
</text>
<partitionlist>
<placement x="%indent%" y="%row1a_y%" w="%content_width%" h="%partitionlist_mount_height%"/>
- <text>Select Partitions to Mount:</text>
+ <text>{@mount_sel_part=Select Partitions to Mount:}</text>
<listtype name="mount"/>
</partitionlist>
<button style="checkbox">
<condition var1="tw_mount_system_ro" op="=" var2="0"/>
<placement x="%indent%" y="%row15a_y%" textplacement="6"/>
- <text>Mount system partition read-only</text>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
<image resource="checkbox_false"/>
<action function="mountsystemtoggle">1</action>
</button>
@@ -2461,7 +2462,7 @@
<button style="checkbox">
<condition var1="tw_mount_system_ro" op="!=" var2="0"/>
<placement x="%indent%" y="%row15a_y%" textplacement="6"/>
- <text>Mount system partition read-only</text>
+ <text>{@mount_sys_ro_chk=Mount system partition read-only}</text>
<image resource="checkbox_true"/>
<actions>
<action function="set">tw_lifetime_writes=2</action>
@@ -2472,7 +2473,7 @@
<button style="main_button_half_height">
<condition var1="tw_has_usb_storage" var2="1"/>
<placement x="%indent%" y="%row18a_y%"/>
- <text>Mount USB Storage</text>
+ <text>{@mount_usb_storage_btn=Mount USB Storage}</text>
<action function="page">usb_mount</action>
</button>
@@ -2482,13 +2483,13 @@
<condition var1="tw_is_decrypted" var2="0"/>
</conditions>
<placement x="%center_x%" y="%row18a_y%"/>
- <text>Decrypt Data</text>
+ <text>{@decrypt_data_btn=Decrypt Data}</text>
<action function="page">decrypt</action>
</button>
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Select Storage</text>
+ <text>{@select_storage_btn=Select Storage}</text>
<actions>
<action function="set">tw_back=mount</action>
<action function="overlay">select_storage</action>
@@ -2501,7 +2502,7 @@
<condition var1="tw_mtp_enabled" var2="0"/>
</conditions>
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Enable MTP</text>
+ <text>{@enable_mtp_btn=Enable MTP}</text>
<action function="startmtp"/>
</button>
@@ -2511,7 +2512,7 @@
<condition var1="tw_mtp_enabled" var2="1"/>
</conditions>
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Disable MTP</text>
+ <text>{@disable_mtp_btn=Disable MTP}</text>
<action function="stopmtp"/>
</button>
@@ -2531,32 +2532,32 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>USB Storage</text>
+ <text>{usb_storage_hdr=USB Storage}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>USB Storage Mounted</text>
+ <text>{@usb_stor_mnt1=USB Storage Mounted}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Be sure to safely remove your device</text>
+ <text>{@usb_stor_mnt2=Be sure to safely remove your device}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>from your computer before unmounting!</text>
+ <text>{@usb_stor_mnt3=from your computer before unmounting!}</text>
</text>
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Unmount</text>
+ <text>{@unmount_btn=Unmount}</text>
<action function="page">usb_umount</action>
</button>
@@ -2604,23 +2605,23 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Reboot Menu</text>
+ <text>{@reboot_hdr=Reboot Menu}</text>
</text>
<button style="main_button">
<condition var1="tw_reboot_system" var2="1"/>
<placement x="%indent%" y="%row2a_y%"/>
- <text>System</text>
+ <text>{@rb_system_btn=System}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2628,17 +2629,17 @@
<button style="main_button">
<condition var1="tw_reboot_poweroff" var2="1"/>
<placement x="%center_x%" y="%row2a_y%"/>
- <text>Power Off</text>
+ <text>{@rb_poweroff_btn=Power Off}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=poweroff</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to power off?</action>
- <action function="set">tw_action_text1=Turning Off...</action>
- <action function="set">tw_complete_text1=Turning Off...</action>
- <action function="set">tw_slider_text=Swipe to Power Off</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_ospo=sure you wish to power off?}</action>
+ <action function="set">tw_action_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_complete_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_slider_text={@swipe_power_off=Swipe to Power Off}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2646,17 +2647,17 @@
<button style="main_button">
<condition var1="tw_reboot_recovery" var2="1"/>
<placement x="%indent%" y="%row8_y%"/>
- <text>Recovery</text>
+ <text>{@rb_recovery_btn=Recovery}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=recovery</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2664,17 +2665,17 @@
<button style="main_button">
<condition var1="tw_reboot_bootloader" var2="1"/>
<placement x="%center_x%" y="%row8_y%"/>
- <text>Bootloader</text>
+ <text>{@rb_bootloader_btn=Bootloader}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=bootloader</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2682,17 +2683,17 @@
<button style="main_button">
<condition var1="tw_download_mode" var2="1"/>
<placement x="%indent%" y="%row13a_y%"/>
- <text>Download</text>
+ <text>{@rb_download_btn=Download}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=download</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Swipe to Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot=Swipe to Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -2713,54 +2714,54 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Unmodified System Partition</text>
+ <text>{@sys_ro_hdr=Unmodified System Partition}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Keep System Read only?</text>
+ <text>{@sys_ro_keep=Keep System Read only?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>TWRP can leave your system partition unmodified</text>
+ <text>{@sys_rop1=TWRP can leave your system partition unmodified}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>to make it easier for you to take official updates.</text>
+ <text>{@sys_rop2=to make it easier for you to take official updates.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>TWRP will be unable to prevent the stock ROM from</text>
+ <text>{@sys_rop3=TWRP will be unable to prevent the stock ROM from}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>replacing TWRP and will not offer to root your device.</text>
+ <text>{@sys_rop4=replacing TWRP and will not offer to root your device.}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row9_y%" placement="5"/>
- <text>Installing zips or performing adb operations may still</text>
+ <text>{@sys_rop5=Installing zips or performing adb operations may still}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row10_y%" placement="5"/>
- <text>modify the system partition.</text>
+ <text>{@sys_rop6=modify the system partition.}</text>
</text>
<checkbox>
<condition var1="tw_is_encrypted" var2="0"/>
<placement x="%indent%" y="%row15_y%"/>
- <text>Never show this screen during boot again</text>
+ <text>{@sys_ro_never_show_chk=Never show this screen during boot again}</text>
<data variable="tw_never_show_system_ro_page"/>
</checkbox>
<button style="main_button_half_height">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Keep Read Only</text>
+ <text>{@sys_ro_keep_ro_btn=Keep Read Only}</text>
<actions>
<action function="mountsystemtoggle">1</action>
<action function="set">tw_page_done=1</action>
@@ -2769,7 +2770,7 @@
</button>
<slider>
- <text>Swipe to Allow Modifications</text>
+ <text>{@swipe_allow_mod=Swipe to Allow Modifications}</text>
<actions>
<action function="mountsystemtoggle">0</action>
<action function="set">tw_page_done=1</action>
@@ -2783,45 +2784,45 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>General Settings</text>
+ <text>{@settings_gen_hdr=General Settings}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="0" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="0" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<listbox style="scrolllist">
<placement x="%indent%" y="%row3a_y%" w="%content_width%" h="%listbox_settings_height%"/>
<icon selected="checkbox_true" unselected="checkbox_false"/>
- <listitem name="Zip file signature verification">
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
<data variable="tw_signed_zip_verify"/>
</listitem>
- <listitem name="Use rm -rf instead of formatting">
+ <listitem name="{@use_rmrf_chk=Use rm -rf instead of formatting}">
<data variable="tw_rm_rf"/>
</listitem>
- <listitem name="Skip MD5 generation during backup">
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
<data variable="tw_skip_md5_generate"/>
</listitem>
- <listitem name="Enable MD5 verification of backup files">
+ <listitem name="{@retore_enable_md5_chk=Enable MD5 verification of backup files}">
<data variable="tw_skip_md5_check"/>
</listitem>
- <listitem name="Use 24-hour clock">
+ <listitem name="{@use24clock_chk=Use 24-hour clock}">
<data variable="tw_military_time"/>
</listitem>
- <listitem name="Reversed navbar layout">
+ <listitem name="{@rev_navbar_chk=Reversed navbar layout}">
<data variable="tw_samsung_navbar"/>
</listitem>
- <listitem name="Simulate actions for theme testing">
+ <listitem name="{@simact_chk=Simulate actions for theme testing}">
<data variable="tw_simulate_actions"/>
</listitem>
- <listitem name="Simulate failure for actions">
+ <listitem name="{@simfail_chk=Simulate failure for actions}">
<condition var1="tw_simulate_actions" var2="1"/>
<data variable="tw_simulate_fail"/>
</listitem>
@@ -2829,7 +2830,7 @@
<button style="main_button_half_height">
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Restore Defaults</text>
+ <text>{@restore_defaults_btn=Restore Defaults}</text>
<action function="restoredefaultsettings"/>
</button>
@@ -2849,83 +2850,83 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Time Zone Settings</text>
+ <text>{@time_zone_hdr=Time Zone}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="%tab4_col2_x%" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="%tab5_col2_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<listbox>
<placement x="%indent%" y="%row3_y%" w="%content_width%" h="%listbox_timezone_height%"/>
- <text>Select Time Zone:</text>
+ <text>{@sel_tz_list=Select Time Zone:}</text>
<data name="tw_time_zone_guisel"/>
- <listitem name="(UTC -11) Samoa, Midway Island">BST11;BDT</listitem>
- <listitem name="(UTC -10) Hawaii">HST10;HDT</listitem>
- <listitem name="(UTC -9) Alaska">AST9;ADT</listitem>
- <listitem name="(UTC -8) Pacific Time">PST8;PDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -7) Mountain Time">MST7;MDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -6) Central Time">CST6;CDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -5) Eastern Time">EST5;EDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -4) Atlantic Time">AST4;ADT</listitem>
- <listitem name="(UTC -3) Brazil, Buenos Aires">GRNLNDST3;GRNLNDDT</listitem>
- <listitem name="(UTC -2) Mid-Atlantic">FALKST2;FALKDT</listitem>
- <listitem name="(UTC -1) Azores, Cape Verde">AZOREST1;AZOREDT</listitem>
- <listitem name="(UTC 0) London, Dublin, Lisbon">GMT0;BST,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +1) Berlin, Brussels, Paris">CET-1;CEST,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +2) Athens, Istanbul, South Africa">WET-2;WET,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +3) Moscow, Baghdad">SAUST-3;SAUDT</listitem>
- <listitem name="(UTC +4) Abu Dhabi, Tbilisi, Muscat">WST-4;WDT</listitem>
- <listitem name="(UTC +5) Yekaterinburg, Islamabad">PAKST-5;PAKDT</listitem>
- <listitem name="(UTC +6) Almaty, Dhaka, Colombo">TASHST-6;TASHDT</listitem>
- <listitem name="(UTC +7) Bangkok, Hanoi, Jakarta">THAIST-7;THAIDT</listitem>
- <listitem name="(UTC +8) Beijing, Singapore, Hong Kong">TAIST-8;TAIDT</listitem>
- <listitem name="(UTC +9) Tokyo, Seoul, Yakutsk">JST-9;JSTDT</listitem>
- <listitem name="(UTC +10) Eastern Australia, Guam">EET-10;EETDT</listitem>
- <listitem name="(UTC +11) Vladivostok, Solomon Islands">MET-11;METDT</listitem>
- <listitem name="(UTC +12) Auckland, Wellington, Fiji">NZST-12;NZDT</listitem>
+ <listitem name="{@utcm11=(UTC -11) Samoa, Midway Island}">BST11;BDT</listitem>
+ <listitem name="{@utcm10=(UTC -10) Hawaii}">HST10;HDT</listitem>
+ <listitem name="{@utcm9=(UTC -9) Alaska}">AST9;ADT</listitem>
+ <listitem name="{@utcm8=(UTC -8) Pacific Time}">PST8;PDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm7=(UTC -7) Mountain Time}">MST7;MDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm6=(UTC -6) Central Time}">CST6;CDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm5=(UTC -5) Eastern Time}">EST5;EDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm4=(UTC -4) Atlantic Time}">AST4;ADT</listitem>
+ <listitem name="{@utcm3=(UTC -3) Brazil, Buenos Aires}">GRNLNDST3;GRNLNDDT</listitem>
+ <listitem name="{@utcm2=(UTC -2) Mid-Atlantic}">FALKST2;FALKDT</listitem>
+ <listitem name="{@utcm1=(UTC -1) Azores, Cape Verde}">AZOREST1;AZOREDT</listitem>
+ <listitem name="{@utc0=(UTC 0) London, Dublin, Lisbon}">GMT0;BST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp1=(UTC +1) Berlin, Brussels, Paris}">CET-1;CEST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp2=(UTC +2) Athens, Istanbul, South Africa}">WET-2;WET,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp3=(UTC +3) Moscow, Baghdad}">SAUST-3;SAUDT</listitem>
+ <listitem name="{@utcp4=(UTC +4) Abu Dhabi, Tbilisi, Muscat}">WST-4;WDT</listitem>
+ <listitem name="{@utcp5=(UTC +5) Yekaterinburg, Islamabad}">PAKST-5;PAKDT</listitem>
+ <listitem name="{@utcp6=(UTC +6) Almaty, Dhaka, Colombo}">TASHST-6;TASHDT</listitem>
+ <listitem name="{@utcp7=(UTC +7) Bangkok, Hanoi, Jakarta}">THAIST-7;THAIDT</listitem>
+ <listitem name="{@utcp8=(UTC +8) Beijing, Singapore, Hong Kong}">TAIST-8;TAIDT</listitem>
+ <listitem name="{@utcp9=(UTC +9) Tokyo, Seoul, Yakutsk}">JST-9;JSTDT</listitem>
+ <listitem name="{@utcp10=(UTC +10) Eastern Australia, Guam}">EET-10;EETDT</listitem>
+ <listitem name="{@utcp11=(UTC +11) Vladivostok, Solomon Islands}">MET-11;METDT</listitem>
+ <listitem name="{@utcp12=(UTC +12) Auckland, Wellington, Fiji}">NZST-12;NZDT</listitem>
</listbox>
<text style="text_m_accent">
<placement x="%indent%" y="%row15a_y%"/>
- <text>Select Offset (usually 0): %tw_time_zone_guioffset%</text>
+ <text>{@sel_tz_offset=Select Offset (usually 0): %tw_time_zone_guioffset%}</text>
</text>
<button style="button_quarter_width">
<placement x="%indent%" y="%row16a_y%"/>
- <text>None</text>
+ <text>{@tz_offset_none=None}</text>
<action function="set">tw_time_zone_guioffset=0</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col2_x%" y="%row16a_y%"/>
- <text>15</text>
+ <text>{@tz_offset_15=15}</text>
<action function="set">tw_time_zone_guioffset=15</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col3_x%" y="%row16a_y%"/>
- <text>30</text>
+ <text>{@tz_offset_30=30}</text>
<action function="set">tw_time_zone_guioffset=30</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col4_x%" y="%row16a_y%"/>
- <text>45</text>
+ <text>{@tz_offset_45=45}</text>
<action function="set">tw_time_zone_guioffset=45</action>
</button>
<checkbox>
<placement x="%indent%" y="%row18a_y%"/>
<font resource="font_m" color="%text_color%"/>
- <text>Use daylight savings time (DST)</text>
+ <text>{@use_dst_chk=Use daylight savings time (DST)}</text>
<data variable="tw_time_zone_guidst"/>
<image checked="checkbox_true" unchecked="checkbox_false"/>
</checkbox>
@@ -2933,14 +2934,14 @@
<text color="%text_color%">
<font resource="font_m"/>
<placement x="%indent%" y="%row20_y%"/>
- <text>Current Time Zone: %tw_time_zone%</text>
+ <text>{@curr_tz=Current Time Zone: %tw_time_zone%}</text>
</text>
<button>
<highlight color="%highlight_color%"/>
<placement x="%center_x%" y="%row21a_y%"/>
<font resource="font_m" color="%text_button_color%"/>
- <text>Set Time Zone</text>
+ <text>{@set_tz_btn=Set Time Zone}</text>
<image resource="main_button_half_height"/>
<action function="setguitimezone"/>
</button>
@@ -2961,18 +2962,18 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Screen Settings</text>
+ <text>{@settings_screen_hdr=Screen Settings}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="%center_x%" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="%tab5_col3_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<button>
@@ -2980,7 +2981,7 @@
<font resource="font_m" color="%text_color%"/>
<condition var1="tw_screen_timeout_secs" op="=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
- <text>Enable screen timeout</text>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
<image resource="checkbox_false"/>
<action function="set">tw_screen_timeout_secs=60</action>
</button>
@@ -2990,7 +2991,7 @@
<font resource="font_m" color="%text_color%"/>
<condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
- <text>Enable screen timeout</text>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
<image resource="checkbox_true"/>
<action function="set">tw_screen_timeout_secs=0</action>
</button>
@@ -2999,14 +3000,14 @@
<condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
<placement x="indent" y="%row5_y%" w="%content_width%"/>
- <text>Screen timeout in seconds:</text>
+ <text>{@screen_to_slider=Screen timeout in seconds:}</text>
<data variable="tw_screen_timeout_secs" min="15" max="300"/>
</slidervalue>
<slidervalue>
<condition var1="tw_has_brightnesss_file" var2="1"/>
<placement x="indent" y="%row10_y%" w="%content_width%"/>
- <text>Brightness: %tw_brightness_pct%%</text>
+ <text>{@screen_bright_slider=Brightness: %tw_brightness_pct%%}</text>
<data variable="tw_brightness_pct" min="10" max="100"/>
<actions>
<action function="set">tw_brightness=%tw_brightness_max%</action>
@@ -3032,35 +3033,35 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Vibration Settings</text>
+ <text>{@vibration_hdr=Vibration}</text>
</text>
<template name="tabs_settings"/>
<fill color="%text_color%">
- <placement x="%tab4_col4_x%" y="%row_tab_y%" w="%tab4_width%" h="%tab_indicator_height%"/>
+ <placement x="%tab5_col4_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
</fill>
<slidervalue>
<placement x="indent" y="%row4_y%" w="%content_width%"/>
- <text>Button Vibration:</text>
+ <text>{@button_vibration=Button Vibration:}</text>
<data variable="tw_button_vibrate" min="0" max="300"/>
</slidervalue>
<slidervalue>
<placement x="indent" y="%row9_y%" w="%content_width%"/>
- <text>Keyboard Vibration:</text>
+ <text>{@kb_vibration=Keyboard Vibration:}</text>
<data variable="tw_keyboard_vibrate" min="0" max="300"/>
</slidervalue>
<slidervalue>
<placement x="indent" y="%row14_y%" w="%content_width%"/>
- <text>Action Vibration:</text>
+ <text>{@act_vibration=Action Vibration:}</text>
<data variable="tw_action_vibrate" min="0" max="500"/>
</slidervalue>
@@ -3075,83 +3076,126 @@
</action>
</page>
+ <page name="settings_language">
+ <template name="page"/>
+
+ <text style="text_l">
+ <placement x="%col1_x_header%" y="%row3_header_y%"/>
+ <text>{@settings_hdr=Settings}</text>
+ </text>
+
+ <text style="text_m">
+ <placement x="%col1_x_header%" y="%row4_header_y%"/>
+ <text>{@language_hdr=Language - %tw_language_display%}</text>
+ </text>
+
+ <template name="tabs_settings"/>
+
+ <fill color="%text_color%">
+ <placement x="%tab5_col5_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
+ </fill>
+
+ <listbox>
+ <placement x="%indent%" y="%row3_y%" w="%content_width%" h="%listbox_settings_height%"/>
+ <text>{@select_language=Select Language:}</text>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </listbox>
+
+ <button style="main_button_half_height">
+ <placement x="%center_x%" y="%row21a_y%"/>
+ <text>{@set_language_btn=Set Language}</text>
+ <action function="setlanguage"></action>
+ </button>
+
+ <action>
+ <touch key="home" />
+ <action function="page">main</action>
+ </action>
+
+ <action>
+ <touch key="back" />
+ <action function="page">settings</action>
+ </action>
+ </page>
+
<page name="advanced">
<template name="page"/>
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<button style="main_button">
<placement x="%indent%" y="%row2a_y%"/>
- <text>Copy Log to SD</text>
+ <text>{@copy_log_btn=Copy Log}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=copylog</action>
- <action function="set">tw_text1=Copy Log to SD Card?</action>
- <action function="set">tw_action_text1=Copying Log to SD Card...</action>
- <action function="set">tw_complete_text1=Log Copy Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@copy_log_confirm=Copy Log to SD Card?}</action>
+ <action function="set">tw_action_text1={@copying_log=Copying Log to SD Card...}</action>
+ <action function="set">tw_complete_text1={@copy_log_complete=Log Copy Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row2a_y%"/>
- <text>Fix Permissions</text>
+ <text>{@fix_perm_btn=Fix Permissions}</text>
<action function="page">fixperms</action>
</button>
<button style="main_button">
<condition var1="tw_allow_partition_sdcard" var2="1"/>
<placement x="%indent%" y="%row8_y%"/>
- <text>Partition SD Card</text>
+ <text>{@part_sd_btn=Partition SD Card}</text>
<action function="page">partsdcard</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row8_y%"/>
- <text>File Manager</text>
+ <text>{@file_manager_btn=File Manager}</text>
<action function="page">filemanagerlist</action>
</button>
<button style="main_button">
<placement x="%indent%" y="%row13a_y%"/>
- <text>Terminal</text>
+ <text>{@terminal_btn=Terminal}</text>
<action function="page">terminalfolder</action>
</button>
<button style="main_button">
<placement x="%center_x%" y="%row13a_y%"/>
- <text>Reload Theme</text>
+ <text>{@reload_theme_btn=Reload Theme}</text>
<action function="reload"/>
</button>
<button style="main_button">
<placement x="%indent%" y="%row19_y%"/>
- <text>ADB Sideload</text>
+ <text>{@adb_sideload_btn=ADB Sideload}</text>
<action function="page">sideload</action>
</button>
<button style="main_button">
<condition var1="tw_show_dumlock" var2="1"/>
<placement x="%center_x%" y="%row19_y%"/>
- <text>HTC Dumlock</text>
+ <text>{@dumlock_btn=HTC Dumlock}</text>
<action function="page">htcdumlock</action>
</button>
<button style="main_button">
<condition var1="tw_has_injecttwrp" var2="1"/>
<placement x="%center_x%" y="%row19_y%"/>
- <text>Re-Inject TWRP</text>
+ <text>{@inject_twrp_btn=Inject TWRP}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=reinjecttwrp</action>
- <action function="set">tw_text1=Re-Inject TWRP?</action>
- <action function="set">tw_action_text1=Re-Injecting TWRP...</action>
- <action function="set">tw_complete_text1=TWRP Injection Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@inject_twrp_confirm=Re-Inject TWRP?}</action>
+ <action function="set">tw_action_text1={@injecting_twrp=Re-Injecting TWRP...}</action>
+ <action function="set">tw_complete_text1={@inject_twrp_complete=TWRP Injection Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -3172,27 +3216,27 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Partition SD Card</text>
+ <text>{@part_sd_hdr=Partition SD Card}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>You will lose all files on your SD card!</text>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>This action cannot be undone!</text>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>EXT Size:</text>
+ <text>{@part_sd_ext_sz=EXT Size:}</text>
</text>
<text style="text_m">
@@ -3202,19 +3246,19 @@
<button style="button_quarter_width">
<placement x="%indent%" y="%row6_y%"/>
- <text>-</text>
+ <text>{@part_sd_m=-}</text>
<action function="addsubtract">tw_sdext_size-128</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col4_x%" y="%row6_y%"/>
- <text>+</text>
+ <text>{@part_sd_p=+}</text>
<action function="addsubtract">tw_sdext_size+128</action>
</button>
<text style="text_m_accent">
<placement x="%center_x%" y="%row9_y%" placement="5"/>
- <text>Swap Size:</text>
+ <text>{@part_sd_swap_sz=Swap Size:}</text>
</text>
<text style="text_m">
@@ -3224,19 +3268,19 @@
<button style="button_quarter_width">
<placement x="%indent%" y="%row10_y%"/>
- <text>-</text>
+ <text>{@part_sd_m=-}</text>
<action function="addsubtract">tw_swap_size-32</action>
</button>
<button style="button_quarter_width">
<placement x="%btn4_col4_x%" y="%row10_y%"/>
- <text>+</text>
+ <text>{@part_sd_p=+}</text>
<action function="addsubtract">tw_swap_size+32</action>
</button>
<text style="text_m_accent">
<placement x="%center_x%" y="%row13_y%" placement="5"/>
- <text>File System:</text>
+ <text>{@file_system=File System:}</text>
</text>
<text style="text_m">
@@ -3257,7 +3301,7 @@
</button>
<slider>
- <text>Swipe to Partition</text>
+ <text>{@swipe_part_sd=Swipe to Partition}</text>
<action function="page">partsdcardaction</action>
<actions>
<action function="set">tw_back=partsdcard</action>
@@ -3265,9 +3309,9 @@
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=set</action>
<action function="set">tw_action2_param=tw_zip_location=/sdcard</action>
- <action function="set">tw_action_text1=Partitioning SD Card...</action>
- <action function="set">tw_action_text2=This will take a few minutes.</action>
- <action function="set">tw_complete_text1=Partitioning Complete</action>
+ <action function="set">tw_action_text1={@partitioning_sd=Partitioning SD Card...}</action>
+ <action function="set">tw_action_text2={@partitioning_sd2=This will take a few minutes.}</action>
+ <action function="set">tw_complete_text1={@part_sd_complete=Partitioning Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -3288,52 +3332,52 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>HTC Dumlock</text>
+ <text>{@dumlock_hdr=HTC Dumlock}</text>
</text>
<button style="main_button_half_height_full_width">
<placement x="%indent%" y="%row15a_y%"/>
- <text>Restore Original Boot</text>
+ <text>{@dumlock_restore_btn=Restore Original Boot}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=htcdumlockrestoreboot</action>
- <action function="set">tw_text1=Restore original boot image?</action>
- <action function="set">tw_action_text1=Restoring Original Boot...</action>
- <action function="set">tw_complete_text1=Restore Original Boot Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@dumlock_restore_confirm=Restore original boot image?}</action>
+ <action function="set">tw_action_text1={@dumlock_restoring=Restoring Original Boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_restore_complete=Restore Original Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_half_height_full_width">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Reflash Recovery</text>
+ <text>{@dumlock_reflash_btn=Reflash Recovery}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=htcdumlockreflashrecovery</action>
- <action function="set">tw_text1=Reflash recovery to boot?</action>
- <action function="set">tw_action_text1=Flashing recovery to boot...</action>
- <action function="set">tw_complete_text1=Recovery Flash to Boot Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@dumlock_reflash_confirm=Reflash recovery to boot?}</action>
+ <action function="set">tw_action_text1={@dumlock_reflashing=Flashing recovery to boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_reflash_complete=Recovery Flash to Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_half_height_full_width">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Install HTC Dumlock</text>
+ <text>{@dumlock_install_btn=Install HTC Dumlock}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=installhtcdumlock</action>
- <action function="set">tw_text1=Install HTC dumlock files to ROM?</action>
- <action function="set">tw_action_text1=Installing HTC Dumlock...</action>
- <action function="set">tw_complete_text1=HTC Dumlock Install Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_text1={@dumlock_install_confirm=Install HTC dumlock files to ROM?}</action>
+ <action function="set">tw_action_text1={@dumlock_installing=Installing HTC Dumlock...}</action>
+ <action function="set">tw_complete_text1={@dumlock_install_complete=HTC Dumlock Install Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -3358,7 +3402,7 @@
</image>
<slider>
- <text>Swipe to Unlock</text>
+ <text>{@swipe_to_unlock=Swipe to Unlock}</text>
<action function="overlay"/>
</slider>
</page>
@@ -3368,12 +3412,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select a File or Folder</text>
+ <text>{@fm_sel_file=Select a File or Folder}</text>
</text>
<template name="sort_options"/>
@@ -3392,14 +3436,14 @@
<actions>
<action function="set">tw_filename1=tw_file_location1</action>
<action function="set">tw_fm_isfolder=1</action>
- <action function="set">tw_fm_type=Folder</action>
+ <action function="set">tw_fm_type={@fm_type_folder=Folder}</action>
<action function="page">filemanageroptions</action>
</actions>
</button>
<action>
<actions>
- <action function="set">tw_fm_type=File</action>
+ <action function="set">tw_fm_type={@fm_type_file=File}</action>
<action function="set">tw_fm_isfolder=0</action>
</actions>
</action>
@@ -3425,17 +3469,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Choose Action</text>
+ <text>{@fm_choose_act=Choose Action}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row2_y%"/>
- <text>%tw_fm_type% selected:</text>
+ <text>{@fm_selected=%tw_fm_type% selected:}</text>
</text>
<text style="text_m">
@@ -3446,10 +3490,10 @@
<button style="main_button_half_height">
<condition var1="tw_fm_isfolder" var2="0"/>
<placement x="%indent%" y="%row15a_y%"/>
- <text>Copy File</text>
+ <text>{@fm_copy_file_btn=Copy File}</text>
<actions>
<action function="set">tw_filemanager_command=cp</action>
- <action function="set">tw_fm_text1=Copying</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
@@ -3457,30 +3501,30 @@
<button style="main_button_half_height">
<condition var1="tw_fm_isfolder" var2="1"/>
<placement x="%indent%" y="%row15a_y%"/>
- <text>Copy Folder</text>
+ <text>{@fm_copy_folder_btn=Copy Folder}</text>
<actions>
<action function="set">tw_filemanager_command=cd "%tw_file_location1%" && cd .. && cp -R</action>
- <action function="set">tw_fm_text1=Copying</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
<button style="main_button_half_height">
<placement x="%center_x%" y="%row15a_y%"/>
- <text>Move</text>
+ <text>{@fm_move_btn=Move}</text>
<actions>
<action function="set">tw_filemanager_command=mv</action>
- <action function="set">tw_fm_text1=Moving</action>
+ <action function="set">tw_fm_text1={@fm_moving=Moving}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
<button style="main_button_half_height">
<placement x="%indent%" y="%row18a_y%"/>
- <text>chmod 755</text>
+ <text>{@fm_chmod755_btn=chmod 755}</text>
<actions>
<action function="set">tw_filemanager_command=chmod 755</action>
- <action function="set">tw_fm_text1=chmod 755</action>
+ <action function="set">tw_fm_text1={@fm_chmod755ing=chmod 755}</action>
<action function="set">tw_fm_text2=</action>
<action function="set">tw_fm_text3=</action>
<action function="set">tw_include_text3=0</action>
@@ -3491,7 +3535,7 @@
<button style="main_button_half_height">
<placement x="%center_x%" y="%row18a_y%"/>
- <text>chmod</text>
+ <text>{@fm_chmod_btn=chmod}</text>
<actions>
<action function="set">tw_filemanager_rename=0000</action>
<action function="set">tw_fm_text2=</action>
@@ -3504,10 +3548,10 @@
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Delete</text>
+ <text>{@fm_delete_btn=Delete}</text>
<actions>
<action function="set">tw_filemanager_command=rm -rf</action>
- <action function="set">tw_fm_text1=Deleting</action>
+ <action function="set">tw_fm_text1={@fm_deleting=Deleting}</action>
<action function="set">tw_fm_text2=</action>
<action function="set">tw_fm_text3=</action>
<action function="set">tw_include_text3=0</action>
@@ -3519,10 +3563,10 @@
<button style="main_button_half_height">
<condition var1="tw_fm_isfolder" var2="0"/>
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Rename File</text>
+ <text>{@fm_rename_file_btn=Rename File}</text>
<actions>
<action function="set">tw_filemanager_rename=tw_selection1</action>
- <action function="set">tw_fm_text1=Renaming</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
<action function="set">tw_filemanager_command=mv</action>
<action function="page">filemanagerrenamefile</action>
</actions>
@@ -3531,10 +3575,10 @@
<button style="main_button_half_height">
<condition var1="tw_fm_isfolder" var2="1"/>
<placement x="%center_x%" y="%row21a_y%"/>
- <text>Rename Folder</text>
+ <text>{@fm_rename_folder_btn=Rename Folder}</text>
<actions>
<action function="set">tw_filemanager_rename=tw_selection1</action>
- <action function="set">tw_fm_text1=Renaming</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
<action function="set">tw_filemanager_command=cd "%tw_file_location1%" && cd .. && mv</action>
<action function="page">filemanagerrenamefolder</action>
</actions>
@@ -3556,12 +3600,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Select Destination Folder</text>
+ <text>{@fm_sel_dest=Select Destination Folder}</text>
</text>
<template name="sort_options"/>
@@ -3602,17 +3646,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Rename %tw_fm_type%</text>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -3635,7 +3679,7 @@
<button style="main_button_half_height">
<placement x="%indent%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -3657,17 +3701,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Rename %tw_fm_type%</text>
+ <text>{@fm_rename_hdr=Rename} %tw_fm_type%</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row2_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -3690,7 +3734,7 @@
<button style="main_button_half_height">
<placement x="%indent%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -3712,17 +3756,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Set Permissions</text>
+ <text>{@fm_set_perms_hdr=Set Permissions}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row2_y%"/>
- <text>Permissions:</text>
+ <text>{@fm_perms=Permissions:}</text>
</text>
<input>
@@ -3744,7 +3788,7 @@
<button style="main_button_half_height">
<placement x="%indent%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -3766,12 +3810,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Confirm Action</text>
+ <text>{@confirm_action=Confirm Action}</text>
</text>
<text style="text_m_accent">
@@ -3796,11 +3840,11 @@
<text style="text_m">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<slider>
- <text>Swipe to Confirm</text>
+ <text>{@swipe_to_confirm=Swipe to Confirm}</text>
<action function="page">filemanageraction</action>
</slider>
@@ -3820,7 +3864,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>File Manager</text>
+ <text>{@fm_hdr=File Manager}</text>
</text>
<text style="text_m">
@@ -3839,7 +3883,7 @@
</conditions>
<actions>
<action function="set">tw_back=filemanagerlist</action>
- <action function="set">tw_complete_text1=File Operation Complete</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
<action function="page">action_complete</action>
</actions>
</action>
@@ -3850,7 +3894,7 @@
<condition var1="tw_operation_status" op="!=" var2="0"/>
</conditions>
<actions>
- <action function="set">tw_complete_text1=File Operation Complete</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
<action function="page">action_complete</action>
</actions>
</action>
@@ -3876,17 +3920,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Decrypt Data</text>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Enter Password:</text>
+ <text>{@decrypt_data_enter_pass=Enter Password:}</text>
</text>
<input>
@@ -3909,12 +3953,12 @@
<text style="text_m_fail">
<condition var1="tw_password_fail" var2="1"/>
<placement x="%indent%" y="%row5_y%"/>
- <text>Password failed, please try again!</text>
+ <text>{@decryt_data_failed=Password failed, please try again!}</text>
</text>
<button style="main_button_half_height">
<placement x="%indent%" y="%row10_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">main</action>
@@ -3929,17 +3973,17 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Decrypt Data</text>
+ <text>{@decrypt_data_hdr=Decrypt Data}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Enter Pattern:</text>
+ <text>{@decrypt_data_enter_pattern=Enter Pattern.}</text>
</text>
<patternpassword>
@@ -3953,7 +3997,7 @@
<button style="main_button_half_height">
<placement x="%indent%" y="%row21a_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">main</action>
@@ -3966,12 +4010,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Mount</text>
+ <text>{@mount_hdr=Mount}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Decrypt Data - Trying Decryption</text>
+ <text>{@decrypt_data_trying=Trying Decryption}</text>
</text>
<template name="console"/>
@@ -4010,12 +4054,12 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Terminal Command</text>
+ <text>{@term_hdr=Terminal Command}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Browse to Starting Folder</text>
+ <text>{@term_sel_folder_hdr=Browse to Starting Folder}</text>
</text>
<template name="sort_options"/>
@@ -4050,7 +4094,7 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Terminal Command</text>
+ <text>{term_hdr=Terminal Command}</text>
</text>
<text style="text_m">
@@ -4077,7 +4121,7 @@
<highlight color="%highlight_color%"/>
<placement x="%btn4_col4_x%" y="%row12a_y%"/>
<font resource="font_m" color="%text_button_color%"/>
- <text>Kill</text>
+ <text>{@term_kill_btn=Kill}</text>
<image resource="tab_4"/>
<action function="killterminal"/>
</button>
@@ -4100,35 +4144,35 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>ADB Sideload</text>
+ <text>{@adb_sideload_hdr=ADB Sideload}</text>
</text>
<checkbox>
<placement x="%indent%" y="%row2_y%"/>
- <text>Wipe Dalvik Cache</text>
+ <text>{@sideload_wipe_dalvik_chk=Wipe Dalvik Cache}</text>
<data variable="tw_wipe_dalvik"/>
</checkbox>
<checkbox>
<placement x="%indent%" y="%row3a_y%"/>
- <text>Wipe Cache</text>
+ <text>{@sideload_wipe_cache_chk=Wipe Cache}</text>
<data variable="tw_wipe_cache"/>
</checkbox>
<slider>
- <text>Swipe to start Sideload</text>
+ <text>{@swipe_to_sideload=Swipe to Start Sideload}</text>
<action function="page">partsdcardaction</action>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=adbsideload</action>
- <action function="set">tw_action_text1=ADB Sideload</action>
- <action function="set">tw_action_text2=Usage: adb sideload filename.zip</action>
- <action function="set">tw_complete_text1=ADB Sideload Complete</action>
+ <action function="set">tw_action_text1={@sideload_confirm=ADB Sideload}</action>
+ <action function="set">tw_action_text2={@sideload_usage=Usage: adb sideload filename.zip}</action>
+ <action function="set">tw_complete_text1={@sideload_complete=ADB Sideload Complete}</action>
<action function="set">tw_has_cancel=1</action>
<action function="set">tw_show_reboot=1</action>
<action function="set">tw_cancel_action=adbsideloadcancel</action>
@@ -4152,43 +4196,43 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>Fix Permissions</text>
+ <text>{@fix_perms_hdr=Fix Permissions}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Note: Fixing permissions is rarely needed.</text>
+ <text>{@fix_perms_note=Note: Fixing permissions is rarely needed.}</text>
</text>
<checkbox>
<placement x="%indent%" y="%row4_y%"/>
- <text>Also fix SELinux Contexts</text>
+ <text>{@fix_perms_selinux_chk=Also fix SELinux Contexts}</text>
<data variable="tw_fixperms_restorecon"/>
</checkbox>
<text style="text_m_fail">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>Fixing SELinux Contexts may cause</text>
+ <text>{@fix_perms_sel_note1=Fixing SELinux Contexts may cause}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>your device to not boot properly.</text>
+ <text>{@fix_perms_sel_note2=your device to not boot properly.}</text>
</text>
<slider>
- <text>Swipe to Fix Permissions</text>
+ <text>{@swipe_to_fix_perms=Swipe to Fix Permissions}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=fixpermissions</action>
- <action function="set">tw_action_text1=Fixing Permissions...</action>
- <action function="set">tw_complete_text1=Fix Permissions Complete</action>
- <action function="set">tw_slider_text=Swipe to Confirm</action>
+ <action function="set">tw_action_text1={@fixing_perms=Fixing Permissions...}</action>
+ <action function="set">tw_complete_text1={@fix_perms_complete=Fix Permissions Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_page</action>
</actions>
@@ -4210,40 +4254,40 @@
<text style="text_l">
<placement x="%col1_x_header%" y="%row3_header_y%"/>
- <text>Reboot</text>
+ <text>{@reboot_hdr=Reboot}</text>
</text>
<text style="text_m">
<placement x="%col1_x_header%" y="%row4_header_y%"/>
- <text>SuperSU Check</text>
+ <text>{@su_hdr=SuperSU Check}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Your device does not appear to be rooted.</text>
+ <text>{@su_note1=Your device does not appear to be rooted.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Install SuperSU now?</text>
+ <text>{@su_note2=Install SuperSU now?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>This will root your device.</text>
+ <text>{@su_note3=This will root your device.}</text>
</text>
<button style="main_button_half_height">
<placement x="%indent%" y="%row18a_y%"/>
- <text>Do not Install</text>
+ <text>{@su_cancel=Do not Install}</text>
<action function="set">tw_page_done=1</action>
</button>
<slider>
- <text>Swipe to Install</text>
+ <text>{@swipe_su_to_install=Swipe to Install}</text>
<actions>
<action function="set">tw_action=installsu</action>
- <action function="set">tw_action_text1=Installing SuperSU</action>
+ <action function="set">tw_action_text1={@su_installing=Installing SuperSU}</action>
<action function="set">tw_action_text2=</action>
<action function="page">singleaction_page</action>
</actions>
@@ -4281,14 +4325,14 @@
</fill>
<partitionlist style="partitionlist_storage">
- <text>Select Storage</text>
+ <text>{@sel_storage_list=Select Storage}</text>
<data name="tw_storage_path"/>
<listtype name="storage"/>
</partitionlist>
<button style="button_third_width">
<placement x="%dialog_button_x%" y="%row14_y%"/>
- <text>OK</text>
+ <text>{@ok_btn=OK}</text>
<actions>
<action function="set">tw_clear_destination=%tw_back%</action>
<action function="overlay"/>
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
old mode 100644
new mode 100755
index 62d0b01..2ed266a
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -184,19 +184,19 @@
<button style="main_button">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Install</text>
+ <text>{@install_btn=Install}</text>
<action function="page">install_type</action>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>Wipe</text>
+ <text>{@wipe_btn=Wipe}</text>
<action function="page">wipe_type1</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Backup</text>
+ <text>{@backup_btn=Backup}</text>
<actions>
<action function="set">tw_back=main</action>
<action function="page">backup_selectstorage</action>
@@ -205,13 +205,13 @@
<button style="main_button">
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Restore</text>
+ <text>{@restore_btn=Restore}</text>
<action function="page">restore</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Reboot</text>
+ <text>{@reboot_btn=Reboot}</text>
<action function="page">reboot</action>
</button>
@@ -228,39 +228,39 @@
<button style="main_button">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Mount</text>
+ <text>{@mount_btn=Mount}</text>
<action function="page">mount</action>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>Settings</text>
+ <text>{@settings_btn=Settings}</text>
<action function="page">settings</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Files</text>
+ <text>{@files_btn=Files}</text>
<action function="page">filemanagerlist</action>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Copy Log</text>
+ <text>{@copy_log_btn=Copy Log}</text>
<actions>
<action function="set">tw_back=main3</action>
<action function="set">tw_action=copylog</action>
- <action function="set">tw_text1=Copy Log to SD Card?</action>
- <action function="set">tw_action_text1=Copying Log to SD Card...</action>
- <action function="set">tw_complete_text1=Log Copy Complete</action>
- <action function="set">tw_slider_text= Confirm</action>
+ <action function="set">tw_text1={@copy_log_confirm=Copy Log to SD Card?}</action>
+ <action function="set">tw_action_text1={@copying_log=Copying Log to SD Card...}</action>
+ <action function="set">tw_complete_text1={@copy_log_complete=Log Copy Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row11_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_btn=Advanced}</text>
<action function="page">advanced</action>
</button>
@@ -289,12 +289,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install > Select Type</text>
+ <text>{@install_hdr=Install} > {@select_type_hdr=Select Type}</text>
</text>
<button style="main_button_full_width">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Install Zip</text>
+ <text>{@install_zip_btn=Install Zip}</text>
<actions>
<action function="queueclear"/>
<action function="set">tw_selectimage=0</action>
@@ -304,7 +304,7 @@
<button style="main_button_full_width">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Install Image</text>
+ <text>{@install_image_btn=Install Image}</text>
<actions>
<action function="queueclear"/>
<action function="set">tw_selectimage=1</action>
@@ -314,7 +314,7 @@
<button style="main_button_full_width">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>ADB Sideload</text>
+ <text>{@adb_sideload_btn=ADB Sideload}</text>
<action function="page">sideload</action>
</button>
@@ -337,13 +337,13 @@
<text style="text_m">
<condition var1="tw_selectimage" var2="0"/>
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install Zip > Select File</text>
+ <text>{@install_zip_hdr=Install Zip} > {@install_select_file_hdr=Select File}</text>
</text>
<text style="text_m">
<condition var1="tw_selectimage" var2="1"/>
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install Image > Select File</text>
+ <text>{@install_image_hdr=Install Image} > {@install_select_file_hdr=Select File}</text>
</text>
<fileselector>
@@ -371,7 +371,7 @@
<highlight color="%highlight_color%"/>
<image resource="q_btn_storage"/>
<actions>
- <action function="set">tw_storagetext=Install > Select Storage</action>
+ <action function="set">tw_storagetext={@install_hdr=Install} > {@select_storage_hdr=Select Storage}</action>
<action function="set">tw_back=install</action>
<action function="page">select_storage</action>
</actions>
@@ -414,12 +414,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install Zip > Queue</text>
+ <text>{@install_zip_hdr=Install Zip} > {@queue_hdr=Queue}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row1_y%"/>
- <text>File %tw_zip_queue_count% of 10:</text>
+ <text>{@zip_queue_count_s=File %tw_zip_queue_count% of 10:}</text>
</text>
<text style="text_m">
@@ -429,7 +429,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row4_y%"/>
- <text>Folder:</text>
+ <text>{@folder=Folder:}</text>
</text>
<text style="text_m">
@@ -439,7 +439,7 @@
<text style="text_m">
<placement x="%indent%" y="%row8_y%"/>
- <text>Press back button to clear the queue.</text>
+ <text>{@zip_back_clear=Press back button to clear the queue.}</text>
</text>
<button>
@@ -495,19 +495,19 @@
<text style="text_m">
<condition var1="tw_selectimage" var2="0"/>
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install Zip > Options</text>
+ <text>{@install_zip_hdr=Install Zip} > {@options_hdr=Options}</text>
</text>
<checkbox>
<placement x="%indent%" y="%row1_y%"/>
- <text>Zip file signature verification</text>
+ <text>{@zip_sig_chk=Zip file signature verification}</text>
<data variable="tw_signed_zip_verify"/>
</checkbox>
<checkbox>
<condition var1="tw_has_injecttwrp" var2="1"/>
<placement x="%indent%" y="%row2a_y%"/>
- <text>Inject TWRP after install</text>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
<data variable="tw_inject_after_zip"/>
</checkbox>
@@ -543,12 +543,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install Zip > Confirm Flash</text>
+ <text>{@install_zip_hdr=Install Zip} > {@confirm_flash_hdr=Confirm Flash}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row1_y%"/>
- <text>File:</text>
+ <text>{@file=File:}</text>
</text>
<text style="text_m">
@@ -564,12 +564,12 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row4_y%"/>
- <text>Queue:</text>
+ <text>{@zip_queue=Queue:}</text>
</text>
<text style="text_m">
<placement x="%indent%" y="%row5_y%"/>
- <text>%tw_zip_queue_count% of 10 files queued</text>
+ <text>{@zip_queue_count_s=File %tw_zip_queue_count% of 10:}</text>
</text>
<button>
@@ -580,21 +580,21 @@
<listbox style="listbox_options">
<placement x="%col1_x_left%" y="%row8_y%" w="%content_width%" h="80"/>
- <listitem name="Zip file signature verification">
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
<data variable="tw_signed_zip_verify"/>
</listitem>
</listbox>
<text style="text_m_accent">
<placement x="%indent%" y="%row7_y%"/>
- <text>Options:</text>
+ <text>{@options=Options:}</text>
</text>
<text style="text_m">
<condition var1="tw_has_injecttwrp" var2="1"/>
<condition var1="tw_inject_after_zip" var2="1"/>
<placement x="%indent%" y="%row9_y%"/>
- <text>Inject TWRP after install</text>
+ <text>{@inject_twrp_chk=Inject TWRP after install}</text>
</text>
<button>
@@ -604,7 +604,7 @@
</button>
<slider>
- <text> Confirm</text>
+ <text>{@swipe_confirm= Confirm}</text>
<action function="flash">flash_zip</action>
</slider>
@@ -629,7 +629,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Installing Zip: %tw_file%</text>
+ <text>{@installing_zip=Installing Zip: %tw_file%}</text>
</text>
<template name="console"/>
@@ -650,20 +650,20 @@
<text style="text_m_fail">
<condition var1="tw_operation_status" op="!=" var2="0"/>
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Installation Failed</text>
+ <text>{@install_failed=Installation Failed}</text>
</text>
<text style="text_m">
<condition var1="tw_operation_status" var2="0"/>
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Installation Successful</text>
+ <text>{@install_successful=Installation Successful}</text>
</text>
<template name="console"/>
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row13_y%"/>
- <text>Wipe cache/dalvik</text>
+ <text>{@wipe_cache_dalvik_btn=Wipe cache/dalvik}</text>
<actions>
<action function="set">tw_back=flash_done</action>
<action function="set">tw_action=wipe</action>
@@ -671,30 +671,30 @@
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=wipe</action>
<action function="set">tw_action2_param=dalvik</action>
- <action function="set">tw_text1=Wipe Cache & Dalvik?</action>
- <action function="set">tw_action_text1=Wiping Cache & Dalvik...</action>
- <action function="set">tw_complete_text1=Cache & Dalvik Wipe Complete</action>
- <action function="set">tw_slider_text= Wipe</action>
+ <action function="set">tw_text1={@wipe_cache_dalvik_confirm=Wipe Cache & Dalvik?}</action>
+ <action function="set">tw_action_text1={@wiping_cache_dalvik=Wiping Cache & Dalvik...}</action>
+ <action function="set">tw_complete_text1={@wipe_cache_dalvik_complete=Cache & Dalvik Wipe Complete}</action>
+ <action function="set">tw_slider_text={@swipe_wipe_s= Wipe}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row13_y%"/>
- <text>Reboot System</text>
+ <text>{@reboot_system_btn=Reboot System}</text>
<actions>
<action function="set">tw_back=main2</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
<action function="set">tw_text3=</action>
<action function="set">tw_text4=</action>
- <action function="set">tw_action_text1=Rebooting...</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text= Reboot</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -723,7 +723,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install Image > Select Target Partition</text>
+ <text>{@install_image_hdr=Install Image} > {install_sel_target=Select Target Partition}</text>
</text>
<partitionlist style="partitionlist_headerless_rb">
@@ -763,12 +763,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install Image > Confirm Flash</text>
+ <text>{@install_image_hdr=Install Image} > {@confirm_flash_hdr=Confirm Flash}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row1_y%"/>
- <text>File:</text>
+ <text>{@file=File:}</text>
</text>
<text style="text_m">
@@ -784,7 +784,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row4_y%"/>
- <text>Target Partition:</text>
+ <text>{@target_partition=Target Partition:}</text>
</text>
<text style="text_m">
@@ -799,14 +799,14 @@
</button>
<slider>
- <text> Confirm</text>
+ <text>{@swipe_confirm= Confirm}</text>
<actions>
<action function="set">tw_back=flashimage_confirm</action>
<action function="set">tw_action=flashimage</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_action_text1=Flashing Image...</action>
+ <action function="set">tw_action_text1={@flashing_image=Flashing Image...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Image Flashed</action>
+ <action function="set">tw_complete_text1={@image_flashed=Image Flashed}</action>
<action function="page">action_page</action>
</actions>
<action function="flashimage"/>
@@ -858,7 +858,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Confirm Action</text>
+ <text>{@confirm_action=Confirm Action}</text>
</text>
<text style="text_m_accent">
@@ -897,7 +897,7 @@
<text style="text_m">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<slider>
@@ -936,7 +936,7 @@
<button style="main_button_half_height">
<condition var1="tw_has_cancel" var2="1"/>
<placement x="%col1_x_right%" y="%row13_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="%tw_cancel_action%">%tw_cancel_param%</action>
</button>
@@ -1008,20 +1008,20 @@
<text style="text_m_fail">
<condition var1="tw_operation_status" op="!=" var2="0"/>
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>%tw_complete_text1% Failed</text>
+ <text>%tw_complete_text1% {@failed=Failed}</text>
</text>
<text style="text_m">
<condition var1="tw_operation_status" var2="0"/>
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>%tw_complete_text1% Successful</text>
+ <text>%tw_complete_text1% {@successful=Successful}</text>
</text>
<template name="console"/>
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row13_y%"/>
- <text>Back</text>
+ <text>{@back_btn=Back}</text>
<actions>
<action function="set">tw_clear_destination=%tw_back%</action>
<action function="page">clear_vars</action>
@@ -1030,20 +1030,20 @@
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row13_y%"/>
- <text>Reboot System</text>
+ <text>{@reboot_system_btn=Reboot System}</text>
<actions>
<action function="set">tw_back=main2</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
<action function="set">tw_text3=</action>
<action function="set">tw_text4=</action>
- <action function="set">tw_action_text1=Rebooting...</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
<action function="set">tw_action_text2=</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text= Reboot</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -1112,18 +1112,18 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Wipe > Select Type</text>
+ <text>{@wipe_hdr=Wipe} > {@select_type_hdr=Select Type}</text>
</text>
<button style="main_button_full_width">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Factory Reset</text>
+ <text>{@factory_reset_btn=Factory Reset}</text>
<action function="page">wipe</action>
</button>
<button style="main_button_full_width">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Advanced Wipe</text>
+ <text>{@advanced_wipe_btn=Advanced Wipe}</text>
<actions>
<action function="set">partitionlisterror=0</action>
<action function="page">advancedwipe</action>
@@ -1155,13 +1155,13 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Wipe > Select Type</text>
+ <text>{@wipe_hdr=Wipe} > {@select_type_hdr=Select Type}</text>
</text>
<button style="main_button_full_width">
<condition var1="tw_has_data_media" var2="1"/>
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Format Data</text>
+ <text>{@format_data_btn=Format Data}</text>
<action function="page">formatdata</action>
</button>
@@ -1171,24 +1171,24 @@
<condition var1="tw_has_data_media" var2="0"/>
</conditions>
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Wipe Encryption</text>
+ <text>{@wipe_enc_btn=Wipe Encryption}</text>
<actions>
<action function="set">tw_back=wipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=DATAMEDIA</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Wipe Encryption from Data?</action>
+ <action function="set">tw_text1={@wipe_enc_confirm=Wipe Encryption from Data?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Formatting Data...</action>
- <action function="set">tw_complete_text1=Data Format Complete</action>
- <action function="set">tw_slider_text= Format Data</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_format_data_s= Format Data}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_full_width">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>File System Options</text><actions>
+ <text>{@file_sys_opt=File System Options}</text><actions>
<action function="set">partitionlisterror=0</action>
<action function="page">partitionoptions_select</action>
</actions>
@@ -1219,18 +1219,18 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Wipe > Factory Reset</text>
+ <text>{@wipe_hdr=Wipe} > {@factory_reset_hdr=Factory Reset}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>Wipes Data, Cache, and Dalvik</text>
+ <text>{@factory_reset1=Wipes Data, Cache, and Dalvik}</text>
</text>
<text style="text_m_accent">
<condition var1="tw_has_data_media" var2="1"/>
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>(not including internal storage)</text>
+ <text>{@factory_reset2=(not including internal storage)}</text>
</text>
<text style="text_m_accent">
@@ -1239,38 +1239,38 @@
<condition var1="fileexists" var2="/and-sec"/>
</conditions>
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>Android Secure</text>
+ <text>{@android_secure=Android Secure}</text>
</text>
<text style="text_m_accent">
<condition var1="tw_has_sdext_partition" var2="1"/>
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>SD-EXT</text>
+ <text>{@sdext=SD-EXT}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>Most of the time this is</text>
+ <text>{@factory_reset3=Most of the time this is}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>the only wipe that you need.</text>
+ <text>{@factory_reset4=the only wipe that you need.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row9_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<slider>
- <text> Wipe</text>
+ <text>{@swipe_wipe_s= Wipe}</text>
<actions>
<action function="set">tw_back=wipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=data</action>
- <action function="set">tw_action_text1=Factory Reset...</action>
- <action function="set">tw_complete_text1=Factory Reset Complete</action>
+ <action function="set">tw_action_text1={@factory_resetting=Factory Reset...}</action>
+ <action function="set">tw_complete_text1={@factory_reset_complete=Factory Reset Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -1297,7 +1297,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Wipe > Advanced Wipe > Select Partitions</text>
+ <text>{@wipe_hdr=Wipe} > {@advanced_wipe_hdr=Advanced Wipe} > {@sel_part_hdr=Select Partitions}</text>
</text>
<partitionlist style="partitionlist_headerless_cb">
@@ -1311,14 +1311,14 @@
</fill>
<slider>
- <text> Wipe</text>
+ <text>{@swipe_wipe_s= Wipe}</text>
<actions>
<action function="set">tw_back=advancedwipe</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=LIST</action>
- <action function="set">tw_text1=Wipe Selected Partition(s)?</action>
- <action function="set">tw_action_text1=Wiping Partition(s)...</action>
- <action function="set">tw_complete_text1=Wipe Complete</action>
+ <action function="set">tw_text1={@wipe_sel_confirm=Wipe Selected Partition(s)?}</action>
+ <action function="set">tw_action_text1={@wiping_part=Wiping Partition(s)...}</action>
+ <action function="set">tw_complete_text1={@wipe_complete=Wipe Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -1341,22 +1341,22 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Wipe > Format Data</text>
+ <text>{@wipe_hdr=Wipe} > {@format_data_hdr=Format Data}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>Format Data will wipe all of your apps,</text>
+ <text>{@format_data_wtc1=Format Data will wipe all of your apps,}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>backups and media. This cannot be undone.</text>
+ <text>{@format_data_wtc2=backups and media. This cannot be undone.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>Type yes to continue. Press back to cancel.</text>
+ <text>{@yes_continue=Type yes to continue. Press back to cancel.}</text>
</text>
<input>
@@ -1391,8 +1391,8 @@
<action function="set">tw_back=formatdata</action>
<action function="set">tw_action=wipe</action>
<action function="set">tw_action_param=DATAMEDIA</action>
- <action function="set">tw_action_text1=Formatting Data...</action>
- <action function="set">tw_complete_text1=Data Format Complete</action>
+ <action function="set">tw_action_text1={@formatting_data=Formatting Data...}</action>
+ <action function="set">tw_complete_text1={@format_data_complete=Data Format Complete}</action>
<action function="page">action_page</action>
</actions>
</action>
@@ -1434,7 +1434,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Wipe > File System Options > Select Partitions</text>
+ <text>{@wipe_hdr=Wipe} > {@file_sys_opt=File System Options} > {@sel_part_hdr=Select Partitions}</text>
</text>
<partitionlist style="partitionlist_headerless_cb">
@@ -1447,27 +1447,10 @@
<placement x="%col1_x_left%" y="row10a_y" w="%content_width%" h="input_line_width"/>
</fill>
- <text style="text_m">
- <placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Select only one partition!</text>
- </text>
-
<text style="text_m_fail">
<condition var1="partitionlisterror" var2="1"/>
<placement x="%col1_x_left%" y="%row12_y%"/>
- <text>Invalid selection!</text>
- </text>
-
- <text style="text_m">
- <condition var1="partitionlisterror" var2="1"/>
- <placement x="%col1_x_left%" y="%row13_y%"/>
- <text>Not all listed partitions</text>
- </text>
-
- <text style="text_m">
- <condition var1="partitionlisterror" var2="1"/>
- <placement x="%col1_x_left%" y="%row14_y%"/>
- <text>can be modified.</text>
+ <text>{@invalid_part_sel=Invalid partition selection}</text>
</text>
<button>
@@ -1498,78 +1481,78 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Wipe > File System Options > Select Action</text>
+ <text>{@wipe_hdr=Wipe} > {@file_sys_opt=File System Options} > {@sel_act_hdr=Select Action}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Partition: %tw_partition_name%</text>
+ <text>{@partition=Partition: %tw_partition_name%}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>File system: %tw_partition_file_system%</text>
+ <text>{@part_curr_fs=File system: %tw_partition_file_system%}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_is_present" var2="1"/>
<placement x="%col1_x_left%" y="%row2a_y%"/>
- <text>Present: Yes</text>
+ <text>{@part_present_yes=Present: Yes}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_is_present" var2="0"/>
<placement x="%col1_x_left%" y="%row2a_y%"/>
- <text>Present: No</text>
+ <text>{@part_present_no=Present: No}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_removable" var2="1"/>
<placement x="%col1_x_right%" y="%row2a_y%"/>
- <text>Removable: Yes</text>
+ <text>{@part_removable_yes=Removable: Yes}</text>
</text>
<text style="text_m">
<condition var1="tw_partition_removable" var2="0"/>
<placement x="%col1_x_right%" y="%row2a_y%"/>
- <text>Removable: No</text>
+ <text>{@part_removable_no=Removable: No}</text>
</text>
<text style="text_m">
<placement x="%col1_x_left%" y="%row3a_y%"/>
- <text>Size: %tw_partition_size%MB</text>
+ <text>{@part_size=Size: %tw_partition_size%MB}</text>
</text>
<text style="text_m">
<placement x="%col1_x_right%" y="%row3a_y%"/>
- <text>Used: %tw_partition_used%MB</text>
+ <text>{@part_used=Used: %tw_partition_used%MB}</text>
</text>
<text style="text_m">
<placement x="%col1_x_left%" y="%row4a_y%"/>
- <text>Free: %tw_partition_free%MB</text>
+ <text>{@part_free=Free: %tw_partition_free%MB}</text>
</text>
<text style="text_m">
<placement x="%col1_x_right%" y="%row4a_y%"/>
- <text>Backup Size: %tw_partition_backup_size%MB</text>
+ <text>{@part_backup_size=Backup Size: %tw_partition_backup_size%MB}</text>
</text>
<button style="main_button">
<condition var1="tw_partition_can_resize" op="=" var2="1"/>
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Resize</text>
+ <text>{@resize_btn_s=Resize}</text>
<actions>
<action function="set">tw_back=partitionoptions</action>
<action function="set">tw_action=resize</action>
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=getpartitiondetails</action>
- <action function="set">tw_text1=Resize %tw_partition_name%?</action>
+ <action function="set">tw_text1={@resize_confirm=Resize %tw_partition_name%?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Resizing...</action>
- <action function="set">tw_complete_text1=Resize Complete</action>
- <action function="set">tw_slider_text= Resize</action>
+ <action function="set">tw_action_text1={@resizing=Resizing...}</action>
+ <action function="set">tw_complete_text1={@resize_complete=Resize Complete}</action>
+ <action function="set">tw_slider_text={@swipe_resize_s= Resize}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1577,17 +1560,17 @@
<button style="main_button">
<condition var1="tw_partition_can_repair" op="=" var2="1"/>
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Repair</text>
+ <text>{@repair_btn_s=Repair}</text>
<actions>
<action function="set">tw_back=partitionoptions</action>
<action function="set">tw_action=repair</action>
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Repair %tw_partition_name%?</action>
+ <action function="set">tw_text1={@repair_confirm=Repair %tw_partition_name%?}</action>
<action function="set">tw_text2=</action>
- <action function="set">tw_action_text1=Repairing...</action>
- <action function="set">tw_complete_text1=Repair Complete</action>
- <action function="set">tw_slider_text= Repair</action>
+ <action function="set">tw_action_text1={@repairing=Repairing...}</action>
+ <action function="set">tw_complete_text1={@repair_complete=Repair Complete}</action>
+ <action function="set">tw_slider_text={@swipe_repair_s= Repair}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1601,7 +1584,7 @@
<button style="main_button">
<placement x="%col1_x_right%" y="%row11_y%"/>
- <text>Change</text>
+ <text>{@change_fs_btn_s=Change}</text>
<action function="page">selectfilesystem</action>
</button>
@@ -1643,7 +1626,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Partition: %tw_partition_name% > Select File System</text>
+ <text>{@change_fs_for_hdr_s=Partition: %tw_partition_name% > Select File System}</text>
</text>
<button style="main_button">
@@ -1656,13 +1639,13 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext2</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT2?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_text3=Not all file systems are supported</action>
- <action function="set">tw_text4=by all kernels. Proceed with caution!</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text= Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT2</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1677,13 +1660,13 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext3</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT3?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_text3=Not all file systems are supported</action>
- <action function="set">tw_text4=by all kernels. Proceed with caution!</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text= Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT3</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1698,13 +1681,13 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=ext4</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to EXT4?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_text3=Not all file systems are supported by all kernels.</action>
- <action function="set">tw_text4=Proceed with caution!</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text= Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=EXT4</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1719,13 +1702,13 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=vfat</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to FAT?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_text3=Not all file systems are supported</action>
- <action function="set">tw_text4=by all kernels. Proceed with caution!</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text= Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=FAT</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1740,13 +1723,13 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=exfat</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to exFAT?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_text3=Not all file systems are supported</action>
- <action function="set">tw_text4=by all kernels. Proceed with caution!</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text= Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=exFAT</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1761,13 +1744,13 @@
<action function="set">tw_action_param=%tw_partition_mount_point%</action>
<action function="set">tw_action_new_file_system=f2fs</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=Change %tw_partition_name% to F2FS?</action>
- <action function="set">tw_text2=</action>
- <action function="set">tw_text3=Not all file systems are supported</action>
- <action function="set">tw_text4=by all kernels. Proceed with caution!</action>
- <action function="set">tw_action_text1=Formatting...</action>
- <action function="set">tw_complete_text1=Format Complete</action>
- <action function="set">tw_slider_text= Change</action>
+ <action function="set">tw_text1={@change_fs_confirm=Change %tw_partition_name%?}</action>
+ <action function="set">tw_text2=F2FS</action>
+ <action function="set">tw_text3={@change_fs_warn1=Some ROMs or kernels may not support some}</action>
+ <action function="set">tw_text4={@change_fs_warn2=file systems. Proceed with caution!}</action>
+ <action function="set">tw_action_text1={@formatting=Formatting...}</action>
+ <action function="set">tw_complete_text1={@format_complete=Format Complete}</action>
+ <action function="set">tw_slider_text={@swipe_change_s= Change}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -1790,7 +1773,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Backup > Select Storage</text>
+ <text>{@backup_hdr=Backup} > {@select_storage_hdr=Select Storage}</text>
</text>
<partitionlist style="partitionlist_headerless_rb">
@@ -1849,7 +1832,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Backup > Select Partitions</text>
+ <text>{@backup_hdr=Backup} > {@sel_part_hdr=Select Partitions}</text>
</text>
<partitionlist style="partitionlist_headerless_cb">
@@ -1916,18 +1899,18 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Backup > Options</text>
+ <text>{@backup_hdr=Backup} > {@options_hdr=Options}</text>
</text>
<listbox style="scrolllist">
<placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
- <listitem name="Enable compression">
+ <listitem name="{@enable_backup_comp_chk=Enable compression}">
<data variable="tw_use_compression"/>
</listitem>
- <listitem name="Skip MD5 generation during backup">
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
<data variable="tw_skip_md5_generate"/>
</listitem>
- <listitem name="Disable Free Space Check">
+ <listitem name="{@disable_backup_space_chk=Disable Free Space Check}">
<data variable="tw_disable_free_space"/>
</listitem>
</listbox>
@@ -2002,12 +1985,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Backup > Confirm Backup</text>
+ <text>{@backup_hdr=Backup} > {@backup_confirm_hdr=Confirm Backup{</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<text style="text_m">
@@ -2035,7 +2018,7 @@
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row3a_y%"/>
- <text>Partitions:</text>
+ <text>{@partitions=Partitions:}</text>
</text>
<partitionlist style="partitionlist_summary">
@@ -2055,7 +2038,7 @@
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>Storage:</text>
+ <text>{@storage=Storage:}</text>
</text>
<text style="text_m">
@@ -2074,7 +2057,7 @@
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row3a_y%"/>
- <text>Encryption:</text>
+ <text>{@encryption=Encryption:}</text>
</text>
<text style="text_m">
@@ -2083,7 +2066,7 @@
<condition var1="tw_encrypt_backup" var2="0"/>
</conditions>
<placement x="%col1_x_right%" y="%row4a_y%"/>
- <text>Disabled</text>
+ <text>{@disabled=Disabled}</text>
</text>
<text style="text_m">
@@ -2092,7 +2075,7 @@
<condition var1="tw_encrypt_backup" var2="1"/>
</conditions>
<placement x="%col1_x_right%" y="%row4a_y%"/>
- <text>Enabled</text>
+ <text>{@enabled=Enabled}</text>
</text>
<button>
@@ -2106,20 +2089,20 @@
<listbox style="listbox_options">
<placement x="%col1_x_right%" y="%row7_y%" w="%content_half_width%" h="80"/>
- <listitem name="Enable Compression">
+ <listitem name="{@enable_backup_comp_chk=Enable compression}">
<data variable="tw_use_compression"/>
</listitem>
- <listitem name="Skip MD5 generation">
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
<data variable="tw_skip_md5_generate"/>
</listitem>
- <listitem name="Skip Free Space Check">
+ <listitem name="{@disable_backup_space_chk=Disable Free Space Check}">
<data variable="tw_disable_free_space"/>
</listitem>
</listbox>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Options:</text>
+ <text>{@options=Options:}</text>
</text>
<button>
@@ -2132,7 +2115,7 @@
</button>
<slider>
- <text> Confirm</text>
+ <text>{@swipe_confirm= Confirm}</text>
<action function="page">backup_run</action>
</slider>
@@ -2149,7 +2132,7 @@
<page name="backup_name1">
<action>
- <condition var1="tw_backup_name" op="=" var2="(Auto Generate)"/>
+ <condition var1="tw_backup_name" op="=" var2="{@auto_generate=(Auto Generate)}"/>
<action function="generatebackupname"/>
</action>
@@ -2165,12 +2148,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Backup > Set Backup Name</text>
+ <text>{@backup_hdr=Backup} > {@backup_name_hdr=Set Backup Name}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -2198,21 +2181,21 @@
<text style="text_m_fail">
<condition var1="tw_fileexists" var2="1"/>
<placement x="%col1_x_left%" y="%row3_input_y%"/>
- <text>A backup with that name already exists!</text>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
</text>
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">backup_confirm</action>
</actions>
</button>
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row4_y%"/>
- <text>Append Date</text>
+ <text>{@append_date_btn=Append Date}</text>
<action function="appenddatetobackupname"/>
</button>
@@ -2221,7 +2204,7 @@
<action>
<touch key="home"/>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">main</action>
</actions>
</action>
@@ -2229,7 +2212,7 @@
<action>
<touch key="back"/>
<actions>
- <action function="set">tw_backup_name=(Auto Generate)</action>
+ <action function="set">tw_backup_name={@auto_generate=(Auto Generate)}</action>
<action function="page">backup_confirm</action>
</actions>
</action>
@@ -2242,12 +2225,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Backup > Enable Encryption</text>
+ <text>{@backup_hdr=Backup} > {@encrypt_backup=Encrypt your Backup?}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Enter Password:</text>
+ <text>{@enter_pass=Enter Password:}</text>
</text>
<input>
@@ -2270,12 +2253,12 @@
<text style="text_m_fail">
<condition var1="tw_password_not_match" var2="1"/>
<placement x="%col1_x_left%" y="%row3_input_y%"/>
- <text>Passwords do not match!</text>
+ <text>{@pass_not_match=Passwords do not match!}</text>
</text>
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_encrypt_backup=0</action>
<action function="set">tw_backup_password=</action>
@@ -2306,12 +2289,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Backup > Enable Encryption</text>
+ <text>{@backup_hdr=Backup} > {@encrypt_backup=Encrypt your Backup?}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Enter Password again:</text>
+ <text>{@enter_pass2=Enter Password again:}</text>
</text>
<input>
@@ -2328,7 +2311,7 @@
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_encrypt_backup=0</action>
<action function="set">tw_backup_password=</action>
@@ -2401,7 +2384,7 @@
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row13_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="cancelbackup"/>
</button>
@@ -2414,7 +2397,7 @@
<condition var1="tw_cancel_backup" var2="0"/>
<actions>
<action function="set">tw_back=backup_selectpartitions</action>
- <action function="set">tw_complete_text1=Backup Complete</action>
+ <action function="set">tw_complete_text1={@backup_complete=Backup Complete}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -2425,7 +2408,7 @@
<condition var1="tw_cancel_backup" var2="1"/>
<actions>
<action function="set">tw_back=backup_selectpartitions</action>
- <action function="set">tw_complete_text1=Backup Cancelled</action>
+ <action function="set">tw_complete_text1={@backup_cancel=Backup Cancelled}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -2439,7 +2422,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Restore > Select Backup</text>
+ <text>{@restore_hdr=Restore} > {@sel_backup_hdr=Select Backup}</text>
</text>
<fileselector>
@@ -2456,7 +2439,7 @@
<highlight color="%highlight_color%"/>
<image resource="q_btn_storage"/>
<actions>
- <action function="set">tw_storagetext=Restore > Select Storage</action>
+ <action function="set">tw_storagetext={@restore_btn=Restore} > {@select_storage_btn=Select Storage}</action>
<action function="set">tw_back=restore</action>
<action function="page">select_storage</action>
</actions>
@@ -2506,12 +2489,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Restore > Encrypted Backup</text>
+ <text>{@restore_hdr=Restore} > {@restore_enc_backup_hdr=Encrypted Backup}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Enter Password:</text>
+ <text>{@enter_pass=Enter Password:}</text>
</text>
<input>
@@ -2534,12 +2517,12 @@
<text style="text_m_fail">
<condition var1="tw_password_fail" var2="1"/>
<placement x="%col1_x_left%" y="%row3_input_y%"/>
- <text>Password failed, please try again!</text>
+ <text>{@restore_dec_fail=Password failed, please try again!}</text>
</text>
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">restore</action>
@@ -2548,16 +2531,17 @@
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row4_y%"/>
- <text>Delete Backup</text>
+ <text>{@del_backup_btn=Delete Backup}</text>
<actions>
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && rm -rf "%tw_restore_name%"</action>
- <action function="set">tw_text1=Delete Backup? %tw_restore_name%</action>
- <action function="set">tw_text2=This cannot be undone!</action>
- <action function="set">tw_action_text1=Deleting Backup...</action>
- <action function="set">tw_complete_text1=Backup Delete Complete</action>
- <action function="set">tw_slider_text=Delete</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
+ <action function="set">tw_text2=%tw_restore_name%</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete_s= Delete}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -2582,7 +2566,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Restore > Trying Decryption</text>
+ <text>{@restore_hdr=Restore} > {@restore_try_decrypt_s=Trying Decryption}</text>
</text>
<template name="console"/>
@@ -2623,7 +2607,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Restore > Select Partitions</text>
+ <text>{@restore_hdr=Restore} > {@sel_part_hdr=Select Partitions}</text>
</text>
<partitionlist style="partitionlist_headerless_cb">
@@ -2651,12 +2635,12 @@
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && rm -rf "%tw_restore_name%"</action>
- <action function="set">tw_text1=Delete Backup?</action>
+ <action function="set">tw_text1={@del_backup_confirm=Delete Backup?}</action>
<action function="set">tw_text2=%tw_restore_name%</action>
- <action function="set">tw_text4=This cannot be undone!</action>
- <action function="set">tw_action_text1=Deleting Backup...</action>
- <action function="set">tw_complete_text1=Backup Delete Complete</action>
- <action function="set">tw_slider_text= Delete</action>
+ <action function="set">tw_text4={@del_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@deleting_backup=Deleting Backup...}</action>
+ <action function="set">tw_complete_text1={@backup_deleted=Backup Delete Complete}</action>
+ <action function="set">tw_slider_text={@swipe_delete_s= Delete}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -2696,12 +2680,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Restore > Options</text>
+ <text>{@restore_hdr=Restore} > {@options_hdr=Options}</text>
</text>
<listbox style="scrolllist">
<placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%partitionlist_wipe_height%"/>
- <listitem name="Enable MD5 verification of backup files">
+ <listitem name="{@retore_enable_md5_chk=Enable MD5 Verification of Backup Files}">
<data variable="tw_skip_md5_check"/>
</listitem>
</listbox>
@@ -2746,12 +2730,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Restore > Rename Backup</text>
+ <text>{@restore_hdr=Restore} > {@rename_backup_hdr=Rename Backup}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -2763,11 +2747,11 @@
<action function="set">tw_back=restore</action>
<action function="set">tw_action=cmd</action>
<action function="set">tw_action_param=cd %tw_backups_folder% && mv "%tw_restore_name%" "%tw_backup_rename%"</action>
- <action function="set">tw_text1=Rename Backup?</action>
- <action function="set">tw_text2=This cannot be undone!</action>
- <action function="set">tw_action_text1=Renaming Backup...</action>
- <action function="set">tw_complete_text1=Backup Rename Complete</action>
- <action function="set">tw_slider_text=Rename</action>
+ <action function="set">tw_text1={@rename_backup_confirm=Rename Backup?}</action>
+ <action function="set">tw_text2={@rename_backup_confirm2=This cannot be undone!}</action>
+ <action function="set">tw_action_text1={@renaming_backup=Renaming Backup...}</action>
+ <action function="set">tw_complete_text1={@rename_backup_complete=Backup Rename Complete}</action>
+ <action function="set">tw_slider_text={@swipe_rename= Rename}</action>
<action function="set">tw_filecheck=%tw_backups_folder%/%tw_backup_rename%</action>
<action function="set">tw_existpage=renamebackup</action>
<action function="set">tw_notexistpage=confirm_action</action>
@@ -2787,12 +2771,12 @@
<text style="text_m_fail">
<condition var1="tw_fileexists" var2="1"/>
<placement x="%col1_x_left%" y="%row3_input_y%"/>
- <text>A backup with that name already exists!</text>
+ <text>{@backup_name_exists=A backup with that name already exists!}</text>
</text>
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">restore_confirm</action>
</button>
@@ -2816,12 +2800,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Restore > Confirm</text>
+ <text>{@restore_hdr=Restore} > {@confirm_hdr=Confirm}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row1_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<text style="text_m">
@@ -2846,7 +2830,7 @@
<text style="text_m_accent">
<placement x="%indent%" y="%row3a_y%"/>
- <text>Partitions:</text>
+ <text>{@partitions=Partitions:}</text>
</text>
<partitionlist style="partitionlist_summary">
@@ -2866,14 +2850,14 @@
<listbox style="listbox_options">
<placement x="%col1_x_right%" y="%row4a_y%" w="%content_half_width%" h="80"/>
- <listitem name="MD5 verification">
+ <listitem name="{@retore_enable_md5_chk=Enable MD5 Verification of Backup Files}">
<data variable="tw_skip_md5_check"/>
</listitem>
</listbox>
<text style="text_m_accent">
<placement x="%col1_x_right%" y="%row3a_y%"/>
- <text>Options:</text>
+ <text>{@options=Options:}</text>
</text>
<button>
@@ -2886,7 +2870,7 @@
</button>
<slider>
- <text> Restore</text>
+ <text>{@swipe_restore_s= Restore}</text>
<action function="page">restore_run</action>
</slider>
@@ -2924,7 +2908,7 @@
<condition var1="tw_operation_state" var2="1"/>
<actions>
<action function="set">tw_back=restore</action>
- <action function="set">tw_complete_text1=Restore Complete</action>
+ <action function="set">tw_complete_text1={@restore_complete=Restore Complete}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_complete</action>
</actions>
@@ -2942,7 +2926,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Mount > %tw_storage_display_name%</text>
+ <text>{@mount_hdr=Mount} > %tw_storage_display_name%</text>
</text>
<partitionlist style="partitionlist_headerless_cb">
@@ -2957,7 +2941,7 @@
<button style="checkbox">
<condition var1="tw_mount_system_ro" op="=" var2="0"/>
<placement x="%col1_x_left%" y="%row11_y%" textplacement="6"/>
- <text>Mount System RO</text>
+ <text>{@mount_sys_ro_s_chk=Mount System RO}</text>
<image resource="checkbox_false"/>
<action function="mountsystemtoggle">1</action>
</button>
@@ -2965,7 +2949,7 @@
<button style="checkbox">
<condition var1="tw_mount_system_ro" op="!=" var2="0"/>
<placement x="%col1_x_left%" y="%row11_y%" textplacement="6"/>
- <text>Mount System RO</text>
+ <text>{@mount_sys_ro_s_chk=Mount System RO}</text>
<image resource="checkbox_true"/>
<actions>
<action function="set">tw_lifetime_writes=2</action>
@@ -2980,7 +2964,7 @@
</conditions>
<placement x="%col1_x_left%" y="%row13_y%" textplacement="6"/>
<image resource="checkbox_false"/>
- <text>Enable MTP</text>
+ <text>{@enable_mtp_btn=Enable MTP}</text>
<action function="startmtp"/>
</button>
@@ -2991,7 +2975,7 @@
</conditions>
<placement x="%col1_x_left%" y="%row13_y%" textplacement="6"/>
<image resource="checkbox_true"/>
- <text>Enable MTP</text>
+ <text>{@disable_mtp_btn=Disable MTP}</text>
<action function="stopmtp"/>
</button>
@@ -3000,7 +2984,7 @@
<highlight color="%highlight_color%"/>
<image resource="q_btn_storage"/>
<actions>
- <action function="set">tw_storagetext=Mount > Select Storage</action>
+ <action function="set">tw_storagetext={@mount_hdr=Mount} > {@select_storage_hdr=Select Storage}</action>
<action function="set">tw_back=mount</action>
<action function="page">select_storage</action>
</actions>
@@ -3031,13 +3015,13 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Mount > %tw_storage_display_name%</text>
+ <text>{@mount_hdr=Mount} > %tw_storage_display_name%</text>
</text>
<button style="main_button_full_width">
<condition var1="tw_has_usb_storage" var2="1"/>
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Mount USB Storage</text>
+ <text>{@mount_usb_storage_btn=Mount USB Storage}</text>
<action function="page">usb_mount</action>
</button>
@@ -3047,7 +3031,7 @@
<condition var1="tw_is_decrypted" var2="0"/>
</conditions>
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Decrypt Data</text>
+ <text>{@decrypt_data_btn=Decrypt Data}</text>
<action function="page">decrypt</action>
</button>
@@ -3076,27 +3060,27 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Mount > USB Storage</text>
+ <text>{@mount_hdr=Mount} > {usb_storage_hdr=USB Storage}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>Device mounted as USB Storage</text>
+ <text>{@usb_stor_mnt1=USB Storage Mounted}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>Be sure to safely remove your device</text>
+ <text>{@usb_stor_mnt2=Be sure to safely remove your device}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>from your computer before unmounting!</text>
+ <text>{@usb_stor_mnt3=from your computer before unmounting!}</text>
</text>
<button style="main_button">
<placement x="%btn4_col2_x%" y="%row11_y%"/>
- <text>Unmount</text>
+ <text>{@unmount_btn=Unmount}</text>
<action function="page">usb_umount</action>
</button>
@@ -3146,23 +3130,23 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Reboot Menu</text>
+ <text>{@reboot_hdr=Reboot Menu}</text>
</text>
<button style="main_button">
<condition var1="tw_reboot_system" var2="1"/>
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>System</text>
+ <text>{@rb_system_btn=System}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=system</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -3170,17 +3154,17 @@
<button style="main_button">
<condition var1="tw_reboot_poweroff" var2="1"/>
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>Power Off</text>
+ <text>{@rb_poweroff_btn=Power Off}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=poweroff</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to power off?</action>
- <action function="set">tw_action_text1=Turning Off...</action>
- <action function="set">tw_complete_text1=Turning Off...</action>
- <action function="set">tw_slider_text=Power Off</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_ospo=sure you wish to power off?}</action>
+ <action function="set">tw_action_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_complete_text1={@turning_off=Turning Off...}</action>
+ <action function="set">tw_slider_text={@swipe_power_off_s=Power Off}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -3188,17 +3172,17 @@
<button style="main_button">
<condition var1="tw_reboot_recovery" var2="1"/>
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Recovery</text>
+ <text>{@rb_recovery_btn=Recovery}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=recovery</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -3206,17 +3190,17 @@
<button style="main_button">
<condition var1="tw_reboot_bootloader" var2="1"/>
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Bootloader</text>
+ <text>{@rb_bootloader_btn=Bootloader}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=bootloader</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -3224,17 +3208,17 @@
<button style="main_button">
<condition var1="tw_download_mode" var2="1"/>
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Download</text>
+ <text>{@rb_download_btn=Download}</text>
<actions>
<action function="set">tw_back=reboot</action>
<action function="set">tw_action=reboot</action>
<action function="set">tw_action_param=download</action>
<action function="set">tw_has_action2=0</action>
- <action function="set">tw_text1=No OS Installed! Are you</action>
- <action function="set">tw_text2=sure you wish to reboot?</action>
- <action function="set">tw_action_text1=Rebooting...</action>
- <action function="set">tw_complete_text1=Rebooting...</action>
- <action function="set">tw_slider_text=Reboot</action>
+ <action function="set">tw_text1={@no_os1=No OS Installed! Are you}</action>
+ <action function="set">tw_text2={@no_osrb=sure you wish to reboot?}</action>
+ <action function="set">tw_action_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_complete_text1={@rebooting=Rebooting...}</action>
+ <action function="set">tw_slider_text={@swipe_reboot_s= Reboot}</action>
<action function="page">rebootcheck</action>
</actions>
</button>
@@ -3257,54 +3241,54 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Unmodified System Partition</text>
+ <text>{@sys_ro_hdr=Unmodified System Partition}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>TWRP has detected an unmodified system partition</text>
+ <text>{@sys_ro_keep=Keep System Read only?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>TWRP can leave your system partition unmodified</text>
+ <text>{@sys_rop1=TWRP can leave your system partition unmodified}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row3_y%" placement="5"/>
- <text>to make it easier for you to take official updates.</text>
+ <text>{@sys_rop2=to make it easier for you to take official updates.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>TWRP will be unable to prevent the stock ROM from</text>
+ <text>{@sys_rop3=TWRP will be unable to prevent the stock ROM from}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>replacing TWRP and will not offer to root your device.</text>
+ <text>{@sys_rop4=replacing TWRP and will not offer to root your device.}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row7_y%" placement="5"/>
- <text>Installing zips or performing adb operations may still</text>
+ <text>{@sys_rop5=Installing zips or performing adb operations may still}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>modify the system partition.</text>
+ <text>{@sys_rop6=modify the system partition.}</text>
</text>
<checkbox>
<condition var1="tw_is_encrypted" var2="0"/>
<placement x="%indent%" y="%row10_y%"/>
- <text>Never show this screen during boot again</text>
+ <text>{@sys_ro_never_show_chk=Never show this screen during boot again}</text>
<data variable="tw_never_show_system_ro_page"/>
</checkbox>
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row13_y%"/>
- <text>Keep Read Only</text>
+ <text>{@sys_ro_keep_ro_btn=Keep Read Only}</text>
<actions>
<action function="mountsystemtoggle">1</action>
<action function="set">tw_page_done=1</action>
@@ -3314,7 +3298,7 @@
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row13_y%"/>
- <text>Allow Modifications</text>
+ <text>{@swipe_allow_mod_s=Allow Modifications}</text>
<actions>
<action function="mountsystemtoggle">0</action>
<action function="set">tw_page_done=1</action>
@@ -3330,36 +3314,36 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings</text>
+ <text>{@settings_hdr=Settings}</text>
</text>
<button style="main_button">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>General</text>
+ <text>{@settings_gen_btn=General}</text>
<action function="page">settings_general</action>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>Time Zone</text>
+ <text>{@settings_tz_btn=Time Zone}</text>
<action function="page">settings_timezone</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Screen</text>
+ <text>{@settings_screen_btn=Screen}</text>
<action function="page">settings_screen</action>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>Vibration</text>
+ <text>{@settings_vibration_btn=Vibration}</text>
<action function="page">settings_vibration</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Language</text>
+ <text>{@settings_language_btn=Language}</text>
<action function="page">settings_language</action>
</button>
@@ -3388,30 +3372,30 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > General</text>
+ <text>{@settings_hdr=Settings} > {@settings_gen_s_hdr=General}</text>
</text>
<listbox style="scrolllist">
<placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%listbox_settings_height%"/>
- <listitem name="Zip file signature verification">
+ <listitem name="{@zip_sig_chk=Zip signature verification}">
<data variable="tw_signed_zip_verify"/>
</listitem>
- <listitem name="Use rm -rf instead of formatting">
+ <listitem name="{@use_rmrf_chk=Use rm -rf instead of formatting}">
<data variable="tw_rm_rf"/>
</listitem>
- <listitem name="Skip MD5 generation during backup">
+ <listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
<data variable="tw_skip_md5_generate"/>
</listitem>
- <listitem name="Enable MD5 verification of backup files">
+ <listitem name="{@retore_enable_md5_chk=Enable MD5 verification of backup files}">
<data variable="tw_skip_md5_check"/>
</listitem>
- <listitem name="Use 24-hour clock">
+ <listitem name="{@use24clock_chk=Use 24-hour clock}">
<data variable="tw_military_time"/>
</listitem>
- <listitem name="Simulate actions for theme testing">
+ <listitem name="{@simact_chk=Simulate actions for theme testing}">
<data variable="tw_simulate_actions"/>
</listitem>
- <listitem name="Simulate failure for actions">
+ <listitem name="{@simfail_chk=Simulate failure for actions}">
<data variable="tw_simulate_fail"/>
<condition var1="tw_simulate_actions" var2="1"/>
</listitem>
@@ -3435,7 +3419,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > Time Zone</text>
+ <text>{@settings_hdr=Settings} > {@time_zone_hdr=Time Zone}</text>
</text>
<text color="%text_color%">
@@ -3447,30 +3431,30 @@
<listbox style="listbox_headerless">
<placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%listbox_timezone_height%"/>
<data name="tw_time_zone_guisel"/>
- <listitem name="(UTC -11) Samoa, Midway Island">BST11;BDT</listitem>
- <listitem name="(UTC -10) Hawaii">HST10;HDT</listitem>
- <listitem name="(UTC -9) Alaska">AST9;ADT</listitem>
- <listitem name="(UTC -8) Pacific Time">PST8;PDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -7) Mountain Time">MST7;MDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -6) Central Time">CST6;CDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -5) Eastern Time">EST5;EDT,M3.2.0,M11.1.0</listitem>
- <listitem name="(UTC -4) Atlantic Time">AST4;ADT</listitem>
- <listitem name="(UTC -3) Brazil, Buenos Aires">GRNLNDST3;GRNLNDDT</listitem>
- <listitem name="(UTC -2) Mid-Atlantic">FALKST2;FALKDT</listitem>
- <listitem name="(UTC -1) Azores, Cape Verde">AZOREST1;AZOREDT</listitem>
- <listitem name="(UTC 0) London, Dublin, Lisbon">GMT0;BST,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +1) Berlin, Brussels, Paris">CET-1;CEST,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +2) Athens, Istanbul, South Africa">WET-2;WET,M3.5.0,M10.5.0</listitem>
- <listitem name="(UTC +3) Moscow, Baghdad">SAUST-3;SAUDT</listitem>
- <listitem name="(UTC +4) Abu Dhabi, Tbilisi, Muscat">WST-4;WDT</listitem>
- <listitem name="(UTC +5) Yekaterinburg, Islamabad">PAKST-5;PAKDT</listitem>
- <listitem name="(UTC +6) Almaty, Dhaka, Colombo">TASHST-6;TASHDT</listitem>
- <listitem name="(UTC +7) Bangkok, Hanoi, Jakarta">THAIST-7;THAIDT</listitem>
- <listitem name="(UTC +8) Beijing, Singapore, Hong Kong">TAIST-8;TAIDT</listitem>
- <listitem name="(UTC +9) Tokyo, Seoul, Yakutsk">JST-9;JSTDT</listitem>
- <listitem name="(UTC +10) Eastern Australia, Guam">EET-10;EETDT</listitem>
- <listitem name="(UTC +11) Vladivostok, Solomon Islands">MET-11;METDT</listitem>
- <listitem name="(UTC +12) Auckland, Wellington, Fiji">NZST-12;NZDT</listitem>
+ <listitem name="{@utcm11=(UTC -11) Samoa, Midway Island}">BST11;BDT</listitem>
+ <listitem name="{@utcm10=(UTC -10) Hawaii}">HST10;HDT</listitem>
+ <listitem name="{@utcm9=(UTC -9) Alaska}">AST9;ADT</listitem>
+ <listitem name="{@utcm8=(UTC -8) Pacific Time}">PST8;PDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm7=(UTC -7) Mountain Time}">MST7;MDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm6=(UTC -6) Central Time}">CST6;CDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm5=(UTC -5) Eastern Time}">EST5;EDT,M3.2.0,M11.1.0</listitem>
+ <listitem name="{@utcm4=(UTC -4) Atlantic Time}">AST4;ADT</listitem>
+ <listitem name="{@utcm3=(UTC -3) Brazil, Buenos Aires}">GRNLNDST3;GRNLNDDT</listitem>
+ <listitem name="{@utcm2=(UTC -2) Mid-Atlantic}">FALKST2;FALKDT</listitem>
+ <listitem name="{@utcm1=(UTC -1) Azores, Cape Verde}">AZOREST1;AZOREDT</listitem>
+ <listitem name="{@utc0=(UTC 0) London, Dublin, Lisbon}">GMT0;BST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp1=(UTC +1) Berlin, Brussels, Paris}">CET-1;CEST,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp2=(UTC +2) Athens, Istanbul, South Africa}">WET-2;WET,M3.5.0,M10.5.0</listitem>
+ <listitem name="{@utcp3=(UTC +3) Moscow, Baghdad}">SAUST-3;SAUDT</listitem>
+ <listitem name="{@utcp4=(UTC +4) Abu Dhabi, Tbilisi, Muscat}">WST-4;WDT</listitem>
+ <listitem name="{@utcp5=(UTC +5) Yekaterinburg, Islamabad}">PAKST-5;PAKDT</listitem>
+ <listitem name="{@utcp6=(UTC +6) Almaty, Dhaka, Colombo}">TASHST-6;TASHDT</listitem>
+ <listitem name="{@utcp7=(UTC +7) Bangkok, Hanoi, Jakarta}">THAIST-7;THAIDT</listitem>
+ <listitem name="{@utcp8=(UTC +8) Beijing, Singapore, Hong Kong}">TAIST-8;TAIDT</listitem>
+ <listitem name="{@utcp9=(UTC +9) Tokyo, Seoul, Yakutsk}">JST-9;JSTDT</listitem>
+ <listitem name="{@utcp10=(UTC +10) Eastern Australia, Guam}">EET-10;EETDT</listitem>
+ <listitem name="{@utcp11=(UTC +11) Vladivostok, Solomon Islands}">MET-11;METDT</listitem>
+ <listitem name="{@utcp12=(UTC +12) Auckland, Wellington, Fiji}">NZST-12;NZDT</listitem>
</listbox>
<button>
@@ -3517,7 +3501,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > Time Zone</text>
+ <text>{@settings_hdr=Settings} > {@time_zone_hdr=Time Zone}</text>
</text>
<text color="%text_color%">
@@ -3529,19 +3513,19 @@
<checkbox>
<placement x="%col1_x_left%" y="%row1_y%"/>
<font resource="font_m" color="%text_color%"/>
- <text>Use daylight savings time (DST)</text>
+ <text>{@use_dst_chk=Use daylight savings time (DST)}</text>
<data variable="tw_time_zone_guidst"/>
<image checked="checkbox_true" unchecked="checkbox_false"/>
</checkbox>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>Select Offset (usually 0): %tw_time_zone_guioffset%</text>
+ <text>{@sel_tz_offset=Select Offset (usually 0): %tw_time_zone_guioffset%}</text>
</text>
<button style="main_button_quarter_width">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>0</text>
+ <text>{@tz_offset_0=0}</text>
<actions>
<action function="set">tw_time_zone_guioffset=0</action>
<action function="setguitimezone"/>
@@ -3550,7 +3534,7 @@
<button style="main_button_quarter_width">
<placement x="%btn4_col2_x%" y="%row6_y%"/>
- <text>15</text>
+ <text>{@tz_offset_15=15}</text>
<actions>
<action function="set">tw_time_zone_guioffset=15</action>
<action function="setguitimezone"/>
@@ -3559,7 +3543,7 @@
<button style="main_button_quarter_width">
<placement x="%btn4_col3_x%" y="%row6_y%"/>
- <text>30</text>
+ <text>{@tz_offset_30=30}</text>
<actions>
<action function="set">tw_time_zone_guioffset=30</action>
<action function="setguitimezone"/>
@@ -3568,7 +3552,7 @@
<button style="main_button_quarter_width">
<placement x="%btn4_col4_x%" y="%row6_y%"/>
- <text>45</text>
+ <text>{@tz_offset_45=45}</text>
<actions>
<action function="set">tw_time_zone_guioffset=45</action>
<action function="setguitimezone"/>
@@ -3587,7 +3571,7 @@
<text style="text_m_accent">
<placement x="%btn4_col2_x%" y="%row11_y%"/>
- <text>Current Time Zone:</text>
+ <text>{@curr_tz_s=Current Time Zone:}</text>
</text>
<text style="text_m">
@@ -3624,14 +3608,14 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > Screen Timeout</text>
+ <text>{@settings_hdr=Settings} > {@settings_screen_timeout_hdr=Screen Timeout}</text>
</text>
<button style="checkbox">
<condition var1="tw_screen_timeout_secs" op="=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
<placement x="%indent%" y="%row1_y%" textplacement="6"/>
- <text>Enable screen timeout</text>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
<image resource="checkbox_false"/>
<action function="set">tw_screen_timeout_secs=60</action>
</button>
@@ -3640,7 +3624,7 @@
<condition var1="tw_screen_timeout_secs" op="!=" var2="0"/>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
<placement x="%indent%" y="%row1_y%" textplacement="6"/>
- <text>Enable screen timeout</text>
+ <text>{@enable_timeout_chk=Enable screen timeout}</text>
<image resource="checkbox_true"/>
<action function="set">tw_screen_timeout_secs=0</action>
</button>
@@ -3648,14 +3632,14 @@
<slidervalue>
<condition var1="tw_no_screen_timeout" op="!=" var2="1"/>
<placement x="col1_x_left" y="%row2a_y%" w="%content_width%"/>
- <text>Screen timeout in seconds (0=disabled): %tw_screen_timeout_secs%</text>
+ <text>{@screen_to_slider_s=Screen timeout in seconds (0=disabled): %tw_screen_timeout_secs%}</text>
<data variable="tw_screen_timeout_secs" min="15" max="300"/>
</slidervalue>
<text style="text_m_fail">
<condition var1="tw_no_screen_timeout" op="=" var2="1"/>
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>Screen timeout setting unavailable</text>
+ <text>{@screen_to_na=Screen timeout setting unavailable}</text>
</text>
<button>
@@ -3683,13 +3667,13 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > Screen Brightness</text>
+ <text>{@settings_hdr=Settings} > {@settings_screen_bright_btn=Screen Brightness}</text>
</text>
<slidervalue>
<condition var1="tw_has_brightnesss_file" var2="1"/>
<placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
- <text>Brightness: %tw_brightness_pct%%</text>
+ <text>{@screen_bright_slider=Brightness: %tw_brightness_pct%%}</text>
<data variable="tw_brightness_pct" min="10" max="100"/>
<actions>
<action function="set">tw_brightness=%tw_brightness_max%</action>
@@ -3702,7 +3686,7 @@
<text style="text_m_fail">
<condition var1="tw_has_brightnesss_file" var2="0"/>
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>Brightness setting unavailable</text>
+ <text>{@screen_bright_na=Brightness setting unavailable}</text>
</text>
<button>
@@ -3730,12 +3714,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > Vibration - Button Vibration</text>
+ <text>{@settings_hdr=Settings} > {@vibration_hdr=Vibration} - {@button_vibration_hdr=Button Vibration}</text>
</text>
<slidervalue>
<placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
- <text>Button Vibration:</text>
+ <text>{@button_vibration=Button Vibration:}</text>
<data variable="tw_button_vibrate" min="0" max="300"/>
</slidervalue>
@@ -3764,12 +3748,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > Vibration - Keyboard Vibration</text>
+ <text>{@settings_hdr=Settings} > {@vibration_hdr=Vibration} - {@kb_vibration_hdr=Keyboard Vibration}</text>
</text>
<slidervalue>
<placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
- <text>Keyboard Vibration:</text>
+ <text>{@kb_vibration=Keyboard Vibration:}</text>
<data variable="tw_keyboard_vibrate" min="0" max="300"/>
</slidervalue>
@@ -3805,12 +3789,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Settings > Vibration - Action Vibration</text>
+ <text>{@settings_hdr=Settings} > {@vibration_hdr=Vibration} - {@act_vibration_hdr=Action Vibration}</text>
</text>
<slidervalue>
<placement x="col1_x_left" y="%row1_y%" w="%content_width%"/>
- <text>Action Vibration:</text>
+ <text>{@act_vibration=Action Vibration:}</text>
<data variable="tw_action_vibrate" min="0" max="500"/>
</slidervalue>
@@ -3832,6 +3816,40 @@
</action>
</page>
+ <page name="settings_language">
+ <template name="page"/>
+
+ <template name="statusbar"/>
+
+ <text style="text_m">
+ <placement x="%col1_x_left%" y="%row1_header_y%"/>
+ <text>{@settings_hdr=Settings} > {@language_hdr=Language} - %tw_language_display%</text>
+ </text>
+
+ <object type="listbox" style="scrolllist">
+ <placement x="%col1_x_left%" y="%row2_header_y%" w="%content_width%" h="%fileselector_filemanager_height%"/>
+ <icon selected="radio_true" unselected="radio_false" />
+ <data name="tw_language" />
+ </object>
+
+ <button>
+ <placement x="%btn4_col4_x%" y="%row11_y%"/>
+ <highlight color="%highlight_color%"/>
+ <image resource="q_btn_folder"/>
+ <action function="setlanguage"></action>
+ </button>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+ </page>
+
<page name="advanced">
<template name="page"/>
@@ -3839,52 +3857,52 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Advanced</text>
+ <text>{@advanced_hdr=Advanced}</text>
</text>
<button style="main_button">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Terminal</text>
+ <text>{@terminal_btn=Terminal}</text>
<action function="page">terminalfolder</action>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>Fix Perms</text>
+ <text>{@fix_perm_s_btn=Fix Perms}</text>
<action function="page">fixperms</action>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>Reload Theme</text>
+ <text>{@reload_theme_btn=Reload Theme}</text>
<action function="reload"/>
</button>
<button style="main_button">
<condition var1="tw_allow_partition_sdcard" var2="1"/>
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>SD Card</text>
+ <text>{@part_sd_s_btn=SD Card}</text>
<action function="page">partsdcard</action>
</button>
<button style="main_button">
<condition var1="tw_show_dumlock" var2="1"/>
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>HTC Dumlock</text>
+ <text>{@dumlock_btn=HTC Dumlock}</text>
<action function="page">htcdumlock</action>
</button>
<button style="main_button">
<condition var1="tw_has_injecttwrp" var2="1"/>
<placement x="%col1_x_right%" y="%row11_y%"/>
- <text>Inject TWRP</text>
+ <text>{@inject_twrp_btn=Inject TWRP}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=reinjecttwrp</action>
- <action function="set">tw_text1=Re-Inject TWRP?</action>
- <action function="set">tw_action_text1=Re-Injecting TWRP...</action>
- <action function="set">tw_complete_text1=TWRP Injection Complete</action>
- <action function="set">tw_slider_text= Confirm</action>
+ <action function="set">tw_text1={@inject_twrp_confirm=Re-Inject TWRP?}</action>
+ <action function="set">tw_action_text1={@injecting_twrp=Re-Injecting TWRP...}</action>
+ <action function="set">tw_complete_text1={@inject_twrp_complete=TWRP Injection Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -3907,22 +3925,22 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Advanced > Partition SD Card</text>
+ <text>{@advanced_hdr=Advanced} > {@part_sd_hdr=Partition SD Card}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>You will lose all files on your SD card!</text>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>This action cannot be undone!</text>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>EXT Size:</text>
+ <text>{@part_sd_ext_sz=EXT Size:}</text>
</text>
<text style="text_m">
@@ -3932,13 +3950,13 @@
<button style="main_button_quarter_width">
<placement x="%indent%" y="%row6_y%"/>
- <text>-</text>
+ <text>{@part_sd_m=-}</text>
<action function="addsubtract">tw_sdext_size-128</action>
</button>
<button style="main_button_quarter_width">
<placement x="%btn4_col4_x%" y="%row6_y%"/>
- <text>+</text>
+ <text>{@part_sd_p=+}</text>
<action function="addsubtract">tw_sdext_size+128</action>
</button>
@@ -3967,22 +3985,22 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Advanced > Partition SD Card</text>
+ <text>{@advanced_hdr=Advanced} > {@part_sd_hdr=Partition SD Card}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>You will lose all files on your SD card!</text>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>This action cannot be undone!</text>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Swap Size:</text>
+ <text>{@part_sd_swap_sz=Swap Size:}</text>
</text>
<text style="text_m">
@@ -3992,13 +4010,13 @@
<button style="main_button_quarter_width">
<placement x="%indent%" y="%row6_y%"/>
- <text>-</text>
+ <text>{@part_sd_m=-}</text>
<action function="addsubtract">tw_swap_size-32</action>
</button>
<button style="main_button_quarter_width">
<placement x="%btn4_col4_x%" y="%row6_y%"/>
- <text>+</text>
+ <text>{@part_sd_p=+}</text>
<action function="addsubtract">tw_swap_size+32</action>
</button>
@@ -4034,22 +4052,22 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Advanced > Partition SD Card</text>
+ <text>{@advanced_hdr=Advanced} > {@part_sd_hdr=Partition SD Card}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>You will lose all files on your SD card!</text>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>This action cannot be undone!</text>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>File System:</text>
+ <text>{@file_system=File System:}</text>
</text>
<text style="text_m">
@@ -4101,36 +4119,36 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Advanced > Partition SD Card</text>
+ <text>{@advanced_hdr=Advanced} > {@part_sd_hdr=Partition SD Card}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row1_y%" placement="5"/>
- <text>You will lose all files on your SD card!</text>
+ <text>{@part_sd_lose=You will lose all files on your SD card!}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>This action cannot be undone!</text>
+ <text>{@part_sd_undo=This action cannot be undone!}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>EXT Size: %tw_sdext_size%</text>
+ <text>{@part_sd_ext_sz=EXT Size:} %tw_sdext_size%</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row6_y%" placement="5"/>
- <text>Swap Size: %tw_swap_size%</text>
+ <text>{@part_sd_swap_sz=Swap Size:} %tw_swap_size%</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>File System: %tw_sdpart_file_system%</text>
+ <text>{@file_system=File System:} %tw_sdpart_file_system%</text>
</text>
<slider>
- <text>Partition</text>
+ <text>{@swipe_part_sd_s=Partition}</text>
<action function="page">partsdcardaction</action>
<actions>
<action function="set">tw_back=partsdcard</action>
@@ -4138,9 +4156,9 @@
<action function="set">tw_has_action2=1</action>
<action function="set">tw_action2=set</action>
<action function="set">tw_action2_param=tw_zip_location=/sdcard</action>
- <action function="set">tw_action_text1=Partitioning SD Card...</action>
- <action function="set">tw_action_text2=This will take a few minutes.</action>
- <action function="set">tw_complete_text1=Partitioning Complete</action>
+ <action function="set">tw_action_text1={@partitioning_sd=Partitioning SD Card...}</action>
+ <action function="set">tw_action_text2={@partitioning_sd2=This will take a few minutes.}</action>
+ <action function="set">tw_complete_text1={@part_sd_complete=Partitioning Complete}</action>
<action function="page">action_page</action>
</actions>
</slider>
@@ -4163,47 +4181,47 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Advanced > HTC Dumlock</text>
+ <text>{@advanced_hdr=Advanced} > {@dumlock_hdr=HTC Dumlock}</text>
</text>
<button style="main_button_full_width">
<placement x="%indent%" y="%row1_y%"/>
- <text>Restore Original Boot</text>
+ <text>{@dumlock_restore_btn=Restore Original Boot}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=htcdumlockrestoreboot</action>
- <action function="set">tw_text1=Restore original boot image?</action>
- <action function="set">tw_action_text1=Restoring Original Boot...</action>
- <action function="set">tw_complete_text1=Restore Original Boot Complete</action>
- <action function="set">tw_slider_text= Confirm</action>
+ <action function="set">tw_text1={@dumlock_restore_confirm=Restore original boot image?}</action>
+ <action function="set">tw_action_text1={@dumlock_restoring=Restoring Original Boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_restore_complete=Restore Original Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_full_width">
<placement x="%indent%" y="%row6_y%"/>
- <text>Reflash Recovery</text>
+ <text>{@dumlock_reflash_btn=Reflash Recovery}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=htcdumlockreflashrecovery</action>
- <action function="set">tw_text1=Reflash recovery to boot?</action>
- <action function="set">tw_action_text1=Flashing recovery to boot...</action>
- <action function="set">tw_complete_text1=Recovery Flash to Boot Complete</action>
- <action function="set">tw_slider_text= Confirm</action>
+ <action function="set">tw_text1={@dumlock_reflash_confirm=Reflash recovery to boot?}</action>
+ <action function="set">tw_action_text1={@dumlock_reflashing=Flashing recovery to boot...}</action>
+ <action function="set">tw_complete_text1={@dumlock_reflash_complete=Recovery Flash to Boot Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
<button style="main_button_full_width">
<placement x="%indent%" y="%row11_y%"/>
- <text>Install HTC Dumlock</text>
+ <text>{@dumlock_install_btn=Install HTC Dumlock}</text>
<actions>
<action function="set">tw_back=htcdumlock</action>
<action function="set">tw_action=installhtcdumlock</action>
- <action function="set">tw_text1=Install HTC dumlock files to ROM?</action>
- <action function="set">tw_action_text1=Installing HTC Dumlock...</action>
- <action function="set">tw_complete_text1=HTC Dumlock Install Complete</action>
- <action function="set">tw_slider_text= Confirm</action>
+ <action function="set">tw_action_text1={@dumlock_installing=Installing HTC Dumlock...}</action>
+ <action function="set">tw_complete_text1={@dumlock_install_complete=HTC Dumlock Install Complete}</action>
+ <action function="set">tw_slider_text={@swipe_to_confirm=Swipe to Confirm}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
<action function="page">confirm_action</action>
</actions>
</button>
@@ -4228,7 +4246,7 @@
</image>
<slider>
- <text> Unlock</text>
+ <text>{@swipe_unlock= Unlock}</text>
<action function="overlay"/>
</slider>
</page>
@@ -4240,7 +4258,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>File Manager > Select File or Folder</text>
+ <text>{@fm_hdr=File Manager} > {@fm_sel_file=Select a File or Folder}</text>
</text>
<fileselector>
@@ -4259,14 +4277,14 @@
<actions>
<action function="set">tw_filename1=tw_file_location1</action>
<action function="set">tw_fm_isfolder=1</action>
- <action function="set">tw_fm_type=Folder</action>
+ <action function="set">tw_fm_type={@fm_type_folder=Folder}</action>
<action function="page">filemanageroptions</action>
</actions>
</button>
<action>
<actions>
- <action function="set">tw_fm_type=File</action>
+ <action function="set">tw_fm_type={@fm_type_file=File}</action>
<action function="set">tw_fm_isfolder=0</action>
</actions>
</action>
@@ -4294,16 +4312,16 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>%tw_fm_type%: %tw_filename1%</text>
+ <text>%tw_fm_type% > %tw_filename1%</text>
</text>
<button style="main_button">
<condition var1="tw_fm_isfolder" var2="0"/>
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Copy</text>
+ <text>{@fm_copy_btn=Copy}</text>
<actions>
<action function="set">tw_filemanager_command=cp</action>
- <action function="set">tw_fm_text1=Copying</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
@@ -4311,30 +4329,30 @@
<button style="main_button">
<condition var1="tw_fm_isfolder" var2="1"/>
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Copy</text>
+ <text>{@fm_copy_btn=Copy}</text>
<actions>
<action function="set">tw_filemanager_command=cd "%tw_file_location1%" && cd .. && cp -R</action>
- <action function="set">tw_fm_text1=Copying</action>
+ <action function="set">tw_fm_text1={@fm_copying=Copying}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
<button style="main_button">
<placement x="%col1_x_right%" y="%row1_y%"/>
- <text>Move</text>
+ <text>{@fm_move_btn=Move}</text>
<actions>
<action function="set">tw_filemanager_command=mv</action>
- <action function="set">tw_fm_text1=Moving</action>
+ <action function="set">tw_fm_text1={@fm_moving=Moving}</action>
<action function="page">choosedestinationfolder</action>
</actions>
</button>
<button style="main_button">
<placement x="%col1_x_left%" y="%row6_y%"/>
- <text>chmod 755</text>
+ <text>{@fm_chmod755_btn=chmod 755}</text>
<actions>
<action function="set">tw_filemanager_command=chmod 755</action>
- <action function="set">tw_fm_text1=chmod 755</action>
+ <action function="set">tw_fm_text1={@fm_chmod755ing=chmod 755}</action>
<action function="set">tw_fm_text2=</action>
<action function="set">tw_fm_text3=</action>
<action function="set">tw_include_text3=0</action>
@@ -4345,7 +4363,7 @@
<button style="main_button">
<placement x="%col1_x_right%" y="%row6_y%"/>
- <text>chmod</text>
+ <text>{@fm_chmod_btn=chmod}</text>
<actions>
<action function="set">tw_filemanager_rename=0000</action>
<action function="set">tw_fm_text2=</action>
@@ -4358,10 +4376,10 @@
<button style="main_button">
<placement x="%col1_x_left%" y="%row11_y%"/>
- <text>Delete</text>
+ <text>{@fm_delete_btn=Delete}</text>
<actions>
<action function="set">tw_filemanager_command=rm -rf</action>
- <action function="set">tw_fm_text1=Deleting</action>
+ <action function="set">tw_fm_text1={@fm_deleting=Deleting}</action>
<action function="set">tw_fm_text2=</action>
<action function="set">tw_fm_text3=</action>
<action function="set">tw_include_text3=0</action>
@@ -4373,10 +4391,10 @@
<button style="main_button">
<condition var1="tw_fm_isfolder" var2="0"/>
<placement x="%col1_x_right%" y="%row11_y%"/>
- <text>Rename</text>
+ <text>{@fm_rename_btn=Rename}</text>
<actions>
<action function="set">tw_filemanager_rename=tw_selection1</action>
- <action function="set">tw_fm_text1=Renaming</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
<action function="set">tw_filemanager_command=mv</action>
<action function="page">filemanagerrenamefile</action>
</actions>
@@ -4385,10 +4403,10 @@
<button style="main_button">
<condition var1="tw_fm_isfolder" var2="1"/>
<placement x="%col1_x_right%" y="%row11_y%"/>
- <text>Rename</text>
+ <text>{@fm_rename_btn=Rename}</text>
<actions>
<action function="set">tw_filemanager_rename=tw_selection1</action>
- <action function="set">tw_fm_text1=Renaming</action>
+ <action function="set">tw_fm_text1={@fm_renaming=Renaming}</action>
<action function="set">tw_filemanager_command=cd "%tw_file_location1%" && cd .. && mv</action>
<action function="page">filemanagerrenamefolder</action>
</actions>
@@ -4412,7 +4430,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>File Manager > Select Destination Folder</text>
+ <text>{@fm_hdr=File Manager} > {@fm_sel_dest=Select Destination Folder}</text>
</text>
<fileselector>
@@ -4455,12 +4473,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>File Manager > Rename %tw_fm_type%</text>
+ <text>{@fm_hdr=File Manager} > {@fm_rename_hdr=Rename} %tw_fm_type%</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -4483,7 +4501,7 @@
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -4507,12 +4525,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>File Manager > Rename %tw_fm_type%</text>
+ <text>{@fm_hdr=File Manager} > {@fm_rename_hdr=Rename} %tw_fm_type%</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Name:</text>
+ <text>{@name=Name:}</text>
</text>
<input>
@@ -4535,7 +4553,7 @@
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -4559,12 +4577,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>File Manager > Set Permissions</text>
+ <text>{@fm_hdr=File Manager} > {@fm_set_perms_hdr=Set Permissions}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Permissions:</text>
+ <text>{@fm_perms=Permissions:}</text>
</text>
<input>
@@ -4586,7 +4604,7 @@
<button style="main_button_half_height">
<placement x="%col1_x_left%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<action function="page">filemanageroptions</action>
</button>
@@ -4610,7 +4628,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>File Manager > Confirm Action</text>
+ <text>{@fm_hdr=File Manager} > {@confirm_action=Confirm Action}</text>
</text>
<text style="text_m_accent">
@@ -4635,11 +4653,11 @@
<text style="text_m">
<placement x="%center_x%" y="%row8_y%" placement="5"/>
- <text>Press back button to cancel.</text>
+ <text>{@back_cancel=Press back button to cancel.}</text>
</text>
<slider>
- <text>Confirm</text>
+ <text>{@swipe_confirm= Confirm}</text>
<action function="page">filemanageraction</action>
</slider>
@@ -4661,7 +4679,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>File Manager > %tw_fm_text1%</text>
+ <text>{@fm_hdr=File Manager} > %tw_fm_text1%</text>
</text>
<template name="console"/>
@@ -4675,7 +4693,7 @@
</conditions>
<actions>
<action function="set">tw_back=filemanagerlist</action>
- <action function="set">tw_complete_text1=File Operation Complete</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
<action function="page">action_complete</action>
</actions>
</action>
@@ -4686,7 +4704,7 @@
<condition var1="tw_operation_status" op="!=" var2="0"/>
</conditions>
<actions>
- <action function="set">tw_complete_text1=File Operation Complete</action>
+ <action function="set">tw_complete_text1={@fm_complete=File Operation Complete}</action>
<action function="page">action_complete</action>
</actions>
</action>
@@ -4714,12 +4732,12 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Mount > Decrypt Data</text>
+ <text>{@mount_hdr=Mount} > {@decrypt_data_hdr=Decrypt Data}</text>
</text>
<text style="text_m_accent">
<placement x="%col1_x_left%" y="%row1_y%"/>
- <text>Enter Password:</text>
+ <text>{@decrypt_data_enter_pass=Enter Password:}</text>
</text>
<input>
@@ -4742,12 +4760,12 @@
<text style="text_m_fail">
<condition var1="tw_password_fail" var2="1"/>
<placement x="%col1_x_left%" y="%row3_input_y%"/>
- <text>Password failed, please try again!</text>
+ <text>{@decryt_data_failed=Password failed, please try again!}</text>
</text>
<button style="main_button_half_height">
<placement x="%col1_x_right%" y="%row4_y%"/>
- <text>Cancel</text>
+ <text>{@cancel_btn=Cancel}</text>
<actions>
<action function="set">tw_page_done=1</action>
<action function="page">main</action>
@@ -4764,17 +4782,17 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Mount > Decrypt Data</text>
+ <text>{@mount_hdr=Mount} > {@decrypt_data_hdr=Decrypt Data}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>Enter Pattern.</text>
+ <text>{@decrypt_data_enter_pattern=Enter Pattern.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row10_y%" placement="5"/>
- <text>Press back to cancel.</text>
+ <text>{@back_cancel=Press back to cancel.}</text>
</text>
<patternpassword>
@@ -4808,7 +4826,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Mount > Trying Decryption</text>
+ <text>{@mount_hdr=Mount} > {@decrypt_data_trying=Trying Decryption}</text>
</text>
<template name="console"/>
@@ -4849,7 +4867,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Terminal > Select Starting Folder</text>
+ <text>{@term_s_hdr=Terminal} > {@term_sel_folder_hdr=Browse to Starting Folder}</text>
</text>
<fileselector>
@@ -4886,7 +4904,7 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Terminal > %tw_terminal_location%</text>
+ <text>{@term_s_hdr=Terminal} > %tw_terminal_location%</text>
</text>
<template name="console_terminal"/>
@@ -4932,35 +4950,35 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Install > ADB Sideload</text>
+ <text>{@install_hdr=Install} > {@adb_sideload_hdr=ADB Sideload}</text>
</text>
<text style="text_m_accent">
<placement x="%indent%" y="%row1_y%"/>
- <text>Options:</text>
+ <text>{@options=Options:}</text>
</text>
<checkbox>
<placement x="%indent%" y="%row2_y%"/>
- <text>Wipe Dalvik Cache</text>
+ <text>{@sideload_wipe_dalvik_chk=Wipe Dalvik Cache}</text>
<data variable="tw_wipe_dalvik"/>
</checkbox>
<checkbox>
<placement x="%indent%" y="%row4a_y%"/>
- <text>Wipe Cache</text>
+ <text>{@sideload_wipe_cache_chk=Wipe Cache}</text>
<data variable="tw_wipe_cache"/>
</checkbox>
<slider>
- <text> Start</text>
+ <text>{@swipe_sideload= Start}</text>
<action function="page">partsdcardaction</action>
<actions>
<action function="set">tw_back=install_type</action>
<action function="set">tw_action=adbsideload</action>
- <action function="set">tw_action_text1=ADB Sideload</action>
- <action function="set">tw_action_text2=Usage: adb sideload filename.zip</action>
- <action function="set">tw_complete_text1=ADB Sideload Complete</action>
+ <action function="set">tw_action_text1={@sideload_confirm=ADB Sideload}</action>
+ <action function="set">tw_action_text2={@sideload_usage=Usage: adb sideload filename.zip}</action>
+ <action function="set">tw_complete_text1={@sideload_complete=ADB Sideload Complete}</action>
<action function="set">tw_has_cancel=1</action>
<action function="set">tw_show_reboot=1</action>
<action function="set">tw_cancel_action=adbsideloadcancel</action>
@@ -4986,38 +5004,38 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Advanced > Fix Permissions</text>
+ <text>{@advanced_hdr=Advanced} > {@fix_perms_hdr=Fix Permissions}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Note: Fixing permissions is rarely needed.</text>
+ <text>{@fix_perms_note=Note: Fixing permissions is rarely needed.}</text>
</text>
<checkbox>
<placement x="%indent%" y="%row4_y%"/>
- <text>Also fix SELinux Contexts</text>
+ <text>{@fix_perms_selinux_chk=Also fix SELinux Contexts}</text>
<data variable="tw_fixperms_restorecon"/>
</checkbox>
<text style="text_m_fail">
<placement x="%center_x%" y="%row6a_y%" placement="5"/>
- <text>Fixing SELinux Contexts may cause</text>
+ <text>{@fix_perms_sel_note1=Fixing SELinux Contexts may cause}</text>
</text>
<text style="text_m_fail">
<placement x="%center_x%" y="%row7a_y%" placement="5"/>
- <text>your device to not boot properly.</text>
+ <text>{@fix_perms_sel_note2=your device to not boot properly.}</text>
</text>
<slider>
- <text> Fix Perms</text>
+ <text>{@swipe_fix_perms= Fix Perms}</text>
<actions>
<action function="set">tw_back=advanced</action>
<action function="set">tw_action=fixpermissions</action>
- <action function="set">tw_action_text1=Fixing Permissions...</action>
- <action function="set">tw_complete_text1=Fix Permissions Complete</action>
- <action function="set">tw_slider_text= Confirm</action>
+ <action function="set">tw_action_text1={@fixing_perms=Fixing Permissions...}</action>
+ <action function="set">tw_complete_text1={@fix_perms_complete=Fix Permissions Complete}</action>
+ <action function="set">tw_slider_text={@swipe_confirm= Confirm}</action>
<action function="set">tw_show_reboot=1</action>
<action function="page">action_page</action>
</actions>
@@ -5041,35 +5059,35 @@
<text style="text_m">
<placement x="%col1_x_left%" y="%row1_header_y%"/>
- <text>Reboot > SuperSU Check</text>
+ <text>{@reboot_hdr=Reboot} > {@su_hdr=SuperSU Check}</text>
</text>
<text style="text_m_accent">
<placement x="%center_x%" y="%row2_y%" placement="5"/>
- <text>Your device does not appear to be rooted.</text>
+ <text>{@su_note1=Your device does not appear to be rooted.}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row4_y%" placement="5"/>
- <text>Install SuperSU now?</text>
+ <text>{@su_note2=Install SuperSU now?}</text>
</text>
<text style="text_m">
<placement x="%center_x%" y="%row5_y%" placement="5"/>
- <text>This will root your device.</text>
+ <text>{@su_note3=This will root your device.}</text>
</text>
<button style="main_button_full_width">
<placement x="%indent%" y="%row6_y%"/>
- <text>Do not Install</text>
+ <text>{@su_cancel=Do not Install}</text>
<action function="set">tw_page_done=1</action>
</button>
<slider>
- <text> Install</text>
+ <text>{@swipe_su_install= Install}</text>
<actions>
<action function="set">tw_action=installsu</action>
- <action function="set">tw_action_text1=Installing SuperSU</action>
+ <action function="set">tw_action_text1={@su_installing=Installing SuperSU}</action>
<action function="set">tw_action_text2=</action>
<action function="page">singleaction_page</action>
</actions>
diff --git a/gui/theme/landscape_hdpi/ui.xml b/gui/theme/landscape_hdpi/ui.xml
index ef967f5..8241641 100644
--- a/gui/theme/landscape_hdpi/ui.xml
+++ b/gui/theme/landscape_hdpi/ui.xml
@@ -94,8 +94,13 @@
<variable name="tab_height" value="72" />
<variable name="tab_indicator_height" value="4" />
<variable name="tab4_width" value="480" />
+ <variable name="tab5_width" value="384" />
<variable name="tab4_col2_x" value="480" />
<variable name="tab4_col4_x" value="1440" />
+ <variable name="tab5_col2_x" value="384" />
+ <variable name="tab5_col3_x" value="768" />
+ <variable name="tab5_col4_x" value="1152" />
+ <variable name="tab5_col5_x" value="1536" />
<variable name="btn4_col2_x_left" value="282" />
<variable name="btn4_col3_x_left" value="516" />
<variable name="btn4_col4_x_left" value="750" />
@@ -255,7 +260,7 @@
<condition var1="tw_no_cpu_temp" var2="0" />
<font resource="font_m" />
<placement x="%indent%" y="%row1_header_y%" />
- <text>CPU: %tw_cpu_temp% °C</text>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
</object>
<object type="text" color="%text_color%">
@@ -272,7 +277,7 @@
</conditions>
<font resource="font_m" />
<placement x="%indent_right%" y="%row1_header_y%" placement="1" />
- <text>Battery: %tw_battery%</text>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
</object>
<object type="fill" color="#000000">
@@ -456,14 +461,14 @@
<object type="button" style="sort_asc">
<condition var1="tw_gui_sort_order" op="=" var2="1" />
<placement x="%col_button_right%" y="%row1a_y%" />
- <text>Sort by Name</text>
+ <text>{@sort_by_name=Sort by Name}</text>
<action function="set">tw_gui_sort_order=-1</action>
</object>
<object type="button" style="sort_desc">
<condition var1="tw_gui_sort_order" op="=" var2="-1" />
<placement x="%col_button_right%" y="%row1a_y%" />
- <text>Sort by Name</text>
+ <text>{@sort_by_name=Sort by Name}</text>
<action function="set">tw_gui_sort_order=1</action>
</object>
@@ -473,21 +478,21 @@
<condition var1="tw_gui_sort_order" op="!=" var2="-1" />
</conditions>
<placement x="%col_button_right%" y="%row1a_y%" />
- <text>Sort by Name</text>
+ <text>{@sort_by_name=Sort by Name}</text>
<action function="set">tw_gui_sort_order=1</action>
</object>
<object type="button" style="sort_asc">
<condition var1="tw_gui_sort_order" op="=" var2="2" />
<placement x="%col_button_right%" y="%row4a_y%" />
- <text>Sort by Date</text>
+ <text>{@sort_by_date=Sort by Date}</text>
<action function="set">tw_gui_sort_order=-2</action>
</object>
<object type="button" style="sort_desc">
<condition var1="tw_gui_sort_order" op="=" var2="-2" />
<placement x="%col_button_right%" y="%row4a_y%" />
- <text>Sort by Date</text>
+ <text>{@sort_by_date=Sort by Date}</text>
<action function="set">tw_gui_sort_order=2</action>
</object>
@@ -497,21 +502,21 @@
<condition var1="tw_gui_sort_order" op="!=" var2="-2" />
</conditions>
<placement x="%col_button_right%" y="%row4a_y%" />
- <text>Sort by Date</text>
+ <text>{@sort_by_date=Sort by Date}</text>
<action function="set">tw_gui_sort_order=2</action>
</object>
<object type="button" style="sort_asc">
<condition var1="tw_gui_sort_order" op="=" var2="3" />
<placement x="%col_button_right%" y="%row7a_y%" />
- <text>Sort by Size</text>
+ <text>{@sort_by_size=Sort by Size}</text>
<action function="set">tw_gui_sort_order=-3</action>
</object>
<object type="button" style="sort_desc">
<condition var1="tw_gui_sort_order" op="=" var2="-3" />
<placement x="%col_button_right%" y="%row7a_y%" />
- <text>Sort by Size</text>
+ <text>{@sort_by_size=Sort by Size}</text>
<action function="set">tw_gui_sort_order=3</action>
</object>
@@ -521,35 +526,41 @@
<condition var1="tw_gui_sort_order" op="!=" var2="-3" />
</conditions>
<placement x="%col_button_right%" y="%row7a_y%" />
- <text>Sort by Size</text>
+ <text>{@sort_by_size=Sort by Size}</text>
<action function="set">tw_gui_sort_order=3</action>
</object>
</template>
<template name="tabs_settings">
<object type="button" style="tab">
- <placement x="0" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>GENERAL</text>
+ <placement x="0" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_general=GENERAL}</text>
<action function="page">settings</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col2_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>TIME ZONE</text>
+ <placement x="%tab5_col2_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_time_zone=TIME ZONE}</text>
<action function="page">settings_timezone</action>
</object>
<object type="button" style="tab">
- <placement x="%center_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>SCREEN</text>
+ <placement x="%tab5_col3_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_screen=SCREEN}</text>
<action function="page">settings_screen</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col4_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>VIBRATION</text>
+ <placement x="%tab5_col4_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_vibration=VIBRATION}</text>
<action function="page">settings_vibration</action>
</object>
+
+ <object type="button" style="tab">
+ <placement x="%tab5_col5_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_language=LANGUAGE}</text>
+ <action function="page">settings_language</action>
+ </object>
</template>
<template name="console">
diff --git a/gui/theme/landscape_mdpi/ui.xml b/gui/theme/landscape_mdpi/ui.xml
index 563f16e..818c23d 100644
--- a/gui/theme/landscape_mdpi/ui.xml
+++ b/gui/theme/landscape_mdpi/ui.xml
@@ -94,8 +94,13 @@
<variable name="tab_height" value="30" />
<variable name="tab_indicator_height" value="2" />
<variable name="tab4_width" value="200" />
+ <variable name="tab5_width" value="160" />
<variable name="tab4_col2_x" value="200" />
<variable name="tab4_col4_x" value="600" />
+ <variable name="tab5_col2_x" value="160" />
+ <variable name="tab5_col3_x" value="320" />
+ <variable name="tab5_col4_x" value="480" />
+ <variable name="tab5_col5_x" value="640" />
<variable name="btn4_col2_x_left" value="117" />
<variable name="btn4_col3_x_left" value="216" />
<variable name="btn4_col4_x_left" value="313" />
@@ -255,7 +260,7 @@
<condition var1="tw_no_cpu_temp" var2="0" />
<font resource="font_m" />
<placement x="%indent%" y="%row1_header_y%" />
- <text>CPU: %tw_cpu_temp% °C</text>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
</object>
<object type="text" color="%text_color%">
@@ -272,7 +277,7 @@
</conditions>
<font resource="font_m" />
<placement x="%indent_right%" y="%row1_header_y%" placement="1" />
- <text>Battery: %tw_battery%</text>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
</object>
<object type="fill" color="#000000">
@@ -456,14 +461,14 @@
<object type="button" style="sort_asc">
<condition var1="tw_gui_sort_order" op="=" var2="1" />
<placement x="%col_button_right%" y="%row1a_y%" />
- <text>Sort by Name</text>
+ <text>{@sort_by_name=Sort by Name}</text>
<action function="set">tw_gui_sort_order=-1</action>
</object>
<object type="button" style="sort_desc">
<condition var1="tw_gui_sort_order" op="=" var2="-1" />
<placement x="%col_button_right%" y="%row1a_y%" />
- <text>Sort by Name</text>
+ <text>{@sort_by_name=Sort by Name}</text>
<action function="set">tw_gui_sort_order=1</action>
</object>
@@ -473,21 +478,21 @@
<condition var1="tw_gui_sort_order" op="!=" var2="-1" />
</conditions>
<placement x="%col_button_right%" y="%row1a_y%" />
- <text>Sort by Name</text>
+ <text>{@sort_by_name=Sort by Name}</text>
<action function="set">tw_gui_sort_order=1</action>
</object>
<object type="button" style="sort_asc">
<condition var1="tw_gui_sort_order" op="=" var2="2" />
<placement x="%col_button_right%" y="%row4a_y%" />
- <text>Sort by Date</text>
+ <text>{@sort_by_date=Sort by Date}</text>
<action function="set">tw_gui_sort_order=-2</action>
</object>
<object type="button" style="sort_desc">
<condition var1="tw_gui_sort_order" op="=" var2="-2" />
<placement x="%col_button_right%" y="%row4a_y%" />
- <text>Sort by Date</text>
+ <text>{@sort_by_date=Sort by Date}</text>
<action function="set">tw_gui_sort_order=2</action>
</object>
@@ -497,21 +502,21 @@
<condition var1="tw_gui_sort_order" op="!=" var2="-2" />
</conditions>
<placement x="%col_button_right%" y="%row4a_y%" />
- <text>Sort by Date</text>
+ <text>{@sort_by_date=Sort by Date}</text>
<action function="set">tw_gui_sort_order=2</action>
</object>
<object type="button" style="sort_asc">
<condition var1="tw_gui_sort_order" op="=" var2="3" />
<placement x="%col_button_right%" y="%row7a_y%" />
- <text>Sort by Size</text>
+ <text>{@sort_by_size=Sort by Size}</text>
<action function="set">tw_gui_sort_order=-3</action>
</object>
<object type="button" style="sort_desc">
<condition var1="tw_gui_sort_order" op="=" var2="-3" />
<placement x="%col_button_right%" y="%row7a_y%" />
- <text>Sort by Size</text>
+ <text>{@sort_by_size=Sort by Size}</text>
<action function="set">tw_gui_sort_order=3</action>
</object>
@@ -521,35 +526,41 @@
<condition var1="tw_gui_sort_order" op="!=" var2="-3" />
</conditions>
<placement x="%col_button_right%" y="%row7a_y%" />
- <text>Sort by Size</text>
+ <text>{@sort_by_size=Sort by Size}</text>
<action function="set">tw_gui_sort_order=3</action>
</object>
</template>
<template name="tabs_settings">
<object type="button" style="tab">
- <placement x="0" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>GENERAL</text>
+ <placement x="0" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_general=GENERAL}</text>
<action function="page">settings</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col2_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>TIME ZONE</text>
+ <placement x="%tab5_col2_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_time_zone=TIME ZONE}</text>
<action function="page">settings_timezone</action>
</object>
<object type="button" style="tab">
- <placement x="%center_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>SCREEN</text>
+ <placement x="%tab5_col3_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_screen=SCREEN}</text>
<action function="page">settings_screen</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col4_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>VIBRATION</text>
+ <placement x="%tab5_col4_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_vibration=VIBRATION}</text>
<action function="page">settings_vibration</action>
</object>
+
+ <object type="button" style="tab">
+ <placement x="%tab5_col5_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_language=LANGUAGE}</text>
+ <action function="page">settings_language</action>
+ </object>
</template>
<template name="console">
diff --git a/gui/theme/portrait_hdpi/ui.xml b/gui/theme/portrait_hdpi/ui.xml
index f8e1181..7708f92 100644
--- a/gui/theme/portrait_hdpi/ui.xml
+++ b/gui/theme/portrait_hdpi/ui.xml
@@ -82,10 +82,15 @@
<variable name="tab_indicator_height" value="6" />
<variable name="tab3_width" value="360" />
<variable name="tab4_width" value="270" />
+ <variable name="tab5_width" value="216" />
<variable name="tab3_col2_x" value="360" />
<variable name="tab3_col3_x" value="720" />
<variable name="tab4_col2_x" value="270" />
<variable name="tab4_col4_x" value="810" />
+ <variable name="tab5_col2_x" value="216" />
+ <variable name="tab5_col3_x" value="432" />
+ <variable name="tab5_col4_x" value="648" />
+ <variable name="tab5_col5_x" value="864" />
<variable name="btn3_col2_x" value="384" />
<variable name="btn3_col3_x" value="732" />
<variable name="btn4_col2_x" value="297" />
@@ -247,7 +252,7 @@
<condition var1="tw_no_cpu_temp" var2="0" />
<font resource="font_m" />
<placement x="%indent%" y="%row1_header_y%" />
- <text>CPU: %tw_cpu_temp% °C</text>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
</object>
<object type="text" color="%text_color%">
@@ -264,7 +269,7 @@
</conditions>
<font resource="font_m" />
<placement x="%indent_right%" y="%row1_header_y%" placement="1" />
- <text>Battery: %tw_battery%</text>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
</object>
<object type="fill" color="#000000">
@@ -357,7 +362,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="1" />
<placement x="%indent%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Name</text>
+ <text>{@sort_by_name_only=Name}</text>
<image resource="sort_asc" />
<action function="set">tw_gui_sort_order=-1</action>
</object>
@@ -367,7 +372,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="-1" />
<placement x="%indent%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Name</text>
+ <text>{@sort_by_name_only=Name}</text>
<image resource="sort_desc" />
<action function="set">tw_gui_sort_order=1</action>
</object>
@@ -380,7 +385,7 @@
</conditions>
<placement x="%indent%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Name</text>
+ <text>{@sort_by_name_only=Name}</text>
<image resource="sort_empty" />
<action function="set">tw_gui_sort_order=1</action>
</object>
@@ -390,7 +395,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="2" />
<placement x="%btn3_col2_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Date</text>
+ <text>{@sort_by_date_only=Date}</text>
<image resource="sort_asc" />
<action function="set">tw_gui_sort_order=-2</action>
</object>
@@ -400,7 +405,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="-2" />
<placement x="%btn3_col2_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Date</text>
+ <text>{@sort_by_date_only=Date}</text>
<image resource="sort_desc" />
<action function="set">tw_gui_sort_order=2</action>
</object>
@@ -413,7 +418,7 @@
</conditions>
<placement x="%btn3_col2_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Date</text>
+ <text>{@sort_by_date_only=Date}</text>
<image resource="sort_empty" />
<action function="set">tw_gui_sort_order=2</action>
</object>
@@ -423,7 +428,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="3" />
<placement x="%btn3_col3_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Size</text>
+ <text>{@sort_by_size_only=Size}</text>
<image resource="sort_asc" />
<action function="set">tw_gui_sort_order=-3</action>
</object>
@@ -433,7 +438,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="-3" />
<placement x="%btn3_col3_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Size</text>
+ <text>{@sort_by_size_only=Size}</text>
<image resource="sort_desc" />
<action function="set">tw_gui_sort_order=3</action>
</object>
@@ -446,7 +451,7 @@
</conditions>
<placement x="%btn3_col3_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Size</text>
+ <text>{@sort_by_size_only=Size}</text>
<image resource="sort_empty" />
<action function="set">tw_gui_sort_order=3</action>
</object>
@@ -455,41 +460,47 @@
<template name="tabs_backup">
<object type="button" style="tab">
<placement x="0" y="%row1_y%" w="%tab3_width%" h="%tab_height%" />
- <text>BACKUP</text>
+ <text>{@tab_backup=BACKUP}</text>
<action function="page">backup</action>
</object>
<object type="button" style="tab">
<placement x="%tab3_col2_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%" />
- <text>OPTIONS</text>
+ <text>{@tab_options=OPTIONS}</text>
<action function="page">backup_options</action>
</object>
</template>
<template name="tabs_settings">
<object type="button" style="tab">
- <placement x="0" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>GENERAL</text>
+ <placement x="0" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_general=GENERAL}</text>
<action function="page">settings</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col2_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>TIME ZONE</text>
+ <placement x="%tab5_col2_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_time_zone=TIME ZONE}</text>
<action function="page">settings_timezone</action>
</object>
<object type="button" style="tab">
- <placement x="%center_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>SCREEN</text>
+ <placement x="%tab5_col3_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_screen=SCREEN}</text>
<action function="page">settings_screen</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col4_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>VIBRATION</text>
+ <placement x="%tab5_col4_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_vibration=VIBRATION}</text>
<action function="page">settings_vibration</action>
</object>
+
+ <object type="button" style="tab">
+ <placement x="%tab5_col5_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_language=LANGUAGE}</text>
+ <action function="page">settings_language</action>
+ </object>
</template>
<template name="console">
diff --git a/gui/theme/portrait_mdpi/ui.xml b/gui/theme/portrait_mdpi/ui.xml
index 1ba10a3..68fd324 100644
--- a/gui/theme/portrait_mdpi/ui.xml
+++ b/gui/theme/portrait_mdpi/ui.xml
@@ -82,10 +82,15 @@
<variable name="tab_indicator_height" value="3" />
<variable name="tab3_width" value="160" />
<variable name="tab4_width" value="120" />
+ <variable name="tab5_width" value="96" />
<variable name="tab3_col2_x" value="160" />
<variable name="tab3_col3_x" value="320" />
<variable name="tab4_col2_x" value="120" />
<variable name="tab4_col4_x" value="360" />
+ <variable name="tab5_col2_x" value="96" />
+ <variable name="tab5_col3_x" value="192" />
+ <variable name="tab5_col4_x" value="288" />
+ <variable name="tab5_col5_x" value="384" />
<variable name="btn3_col2_x" value="170" />
<variable name="btn3_col3_x" value="325" />
<variable name="btn4_col2_x" value="131" />
@@ -247,7 +252,7 @@
<condition var1="tw_no_cpu_temp" var2="0" />
<font resource="font_m" />
<placement x="%indent%" y="%row1_header_y%" />
- <text>CPU: %tw_cpu_temp% °C</text>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
</object>
<object type="text" color="%text_color%">
@@ -264,7 +269,7 @@
</conditions>
<font resource="font_m" />
<placement x="%indent_right%" y="%row1_header_y%" placement="1" />
- <text>Battery: %tw_battery%</text>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
</object>
<object type="fill" color="#000000">
@@ -357,7 +362,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="1" />
<placement x="%indent%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Name</text>
+ <text>{@sort_by_name_only=Name}</text>
<image resource="sort_asc" />
<action function="set">tw_gui_sort_order=-1</action>
</object>
@@ -367,7 +372,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="-1" />
<placement x="%indent%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Name</text>
+ <text>{@sort_by_name_only=Name}</text>
<image resource="sort_desc" />
<action function="set">tw_gui_sort_order=1</action>
</object>
@@ -380,7 +385,7 @@
</conditions>
<placement x="%indent%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Name</text>
+ <text>{@sort_by_name_only=Name}</text>
<image resource="sort_empty" />
<action function="set">tw_gui_sort_order=1</action>
</object>
@@ -390,7 +395,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="2" />
<placement x="%btn3_col2_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Date</text>
+ <text>{@sort_by_date_only=Date}</text>
<image resource="sort_asc" />
<action function="set">tw_gui_sort_order=-2</action>
</object>
@@ -400,7 +405,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="-2" />
<placement x="%btn3_col2_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Date</text>
+ <text>{@sort_by_date_only=Date}</text>
<image resource="sort_desc" />
<action function="set">tw_gui_sort_order=2</action>
</object>
@@ -413,7 +418,7 @@
</conditions>
<placement x="%btn3_col2_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Date</text>
+ <text>{@sort_by_date_only=Date}</text>
<image resource="sort_empty" />
<action function="set">tw_gui_sort_order=2</action>
</object>
@@ -423,7 +428,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="3" />
<placement x="%btn3_col3_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Size</text>
+ <text>{@sort_by_size_only=Size}</text>
<image resource="sort_asc" />
<action function="set">tw_gui_sort_order=-3</action>
</object>
@@ -433,7 +438,7 @@
<condition var1="tw_gui_sort_order" op="=" var2="-3" />
<placement x="%btn3_col3_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Size</text>
+ <text>{@sort_by_size_only=Size}</text>
<image resource="sort_desc" />
<action function="set">tw_gui_sort_order=3</action>
</object>
@@ -446,7 +451,7 @@
</conditions>
<placement x="%btn3_col3_x%" y="%row1a_y%" />
<font resource="font_s" color="%text_button_color%" />
- <text>Size</text>
+ <text>{@sort_by_size_only=Size}</text>
<image resource="sort_empty" />
<action function="set">tw_gui_sort_order=3</action>
</object>
@@ -455,41 +460,47 @@
<template name="tabs_backup">
<object type="button" style="tab">
<placement x="0" y="%row1_y%" w="%tab3_width%" h="%tab_height%" />
- <text>BACKUP</text>
+ <text>{@tab_backup=BACKUP}</text>
<action function="page">backup</action>
</object>
<object type="button" style="tab">
<placement x="%tab3_col2_x%" y="%row1_y%" w="%tab3_width%" h="%tab_height%" />
- <text>OPTIONS</text>
+ <text>{@tab_options=OPTIONS}</text>
<action function="page">backup_options</action>
</object>
</template>
<template name="tabs_settings">
<object type="button" style="tab">
- <placement x="0" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>GENERAL</text>
+ <placement x="0" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_general=GENERAL}</text>
<action function="page">settings</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col2_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>TIME ZONE</text>
+ <placement x="%tab5_col2_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_time_zone=TIME ZONE}</text>
<action function="page">settings_timezone</action>
</object>
<object type="button" style="tab">
- <placement x="%center_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>SCREEN</text>
+ <placement x="%tab5_col3_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_screen=SCREEN}</text>
<action function="page">settings_screen</action>
</object>
<object type="button" style="tab">
- <placement x="%tab4_col4_x%" y="%row1_y%" w="%tab4_width%" h="%tab_height%" />
- <text>VIBRATION</text>
+ <placement x="%tab5_col4_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_vibration=VIBRATION}</text>
<action function="page">settings_vibration</action>
</object>
+
+ <object type="button" style="tab">
+ <placement x="%tab5_col5_x%" y="%row1_y%" w="%tab5_width%" h="%tab_height%" />
+ <text>{@tab_language=LANGUAGE}</text>
+ <action function="page">settings_language</action>
+ </object>
</template>
<template name="console">
diff --git a/gui/theme/watch_mdpi/ui.xml b/gui/theme/watch_mdpi/ui.xml
index f47dfa1..7c7715a 100644
--- a/gui/theme/watch_mdpi/ui.xml
+++ b/gui/theme/watch_mdpi/ui.xml
@@ -193,14 +193,14 @@
<condition var1="tw_no_cpu_temp" var2="1" />
<font resource="font_m" />
<placement x="%indent%" y="%row1_header_y%" />
- <text>TWRP %tw_version%</text>
+ <text>{@twrp_watch_header=TWRP %tw_version%}</text>
</object>
<object type="text" color="%text_color%">
<condition var1="tw_no_cpu_temp" var2="0" />
<font resource="font_m" />
<placement x="%indent%" y="%row1_header_y%" />
- <text>CPU: %tw_cpu_temp% °C</text>
+ <text>{@cpu_temp=CPU: %tw_cpu_temp% °C}</text>
</object>
<object type="text" color="%text_color%">
@@ -217,7 +217,7 @@
</conditions>
<font resource="font_m" />
<placement x="%indent_right%" y="%row1_header_y%" placement="1" />
- <text>Battery: %tw_battery%</text>
+ <text>{@battery_pct=Battery: %tw_battery%}</text>
</object>
<object type="fill" color="#000000">
diff --git a/gui/twmsg.cpp b/gui/twmsg.cpp
new file mode 100644
index 0000000..00c6931
--- /dev/null
+++ b/gui/twmsg.cpp
@@ -0,0 +1,129 @@
+/*
+ Copyright 2015 _that/TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "../data.hpp"
+#include "pages.hpp"
+#include "resources.hpp"
+
+#include "twmsg.h"
+
+std::string Message::GetFormatString(const std::string& name) const
+{
+ std::string resname;
+ size_t pos = name.find('=');
+ if (pos == std::string::npos)
+ resname = name;
+ else
+ resname = name.substr(0, pos);
+
+ std::string formatstr = resourceLookup(resname);
+ bool notfound = formatstr.empty() || formatstr[0] == '['; // HACK: TODO: integrate this with resource-not-found logic
+ if (notfound && pos != std::string::npos)
+ // resource not found - use the default format string specified after "="
+ formatstr = name.substr(pos + 1);
+ return formatstr;
+}
+
+// Look up in local replacement vars first, if not found then use outer lookup object
+class LocalLookup : public StringLookup
+{
+ const std::vector<std::string>& vars;
+ const StringLookup& next;
+ public:
+ LocalLookup(const std::vector<std::string>& vars, const StringLookup& next) : vars(vars), next(next) {}
+ virtual std::string operator()(const std::string& name) const
+ {
+ if (!name.empty() && isdigit(name[0])) { // {1}..{9}
+ int i = atoi(name.c_str());
+ if (i > 0 && i <= (int)vars.size())
+ return vars[i - 1];
+ }
+ return next(name);
+ }
+};
+
+// conversion to final string
+Message::operator std::string() const
+{
+ // do resource lookup
+ std::string str = GetFormatString(name);
+
+ LocalLookup lookup(variables, varLookup);
+
+ // now insert stuff into curly braces
+
+ size_t pos = 0;
+ while ((pos = str.find('{', pos)) < std::string::npos) {
+ size_t end = str.find('}', pos);
+ if (end == std::string::npos)
+ break;
+
+ std::string varname = str.substr(pos + 1, end - pos - 1);
+ std::string vartext = lookup(varname);
+
+ str.replace(pos, end - pos + 1, vartext);
+ }
+ // TODO: complain about too many or too few numbered replacement variables
+ return str;
+}
+
+/*
+Resource manager lookup
+*/
+class ResourceLookup : public StringLookup
+{
+public:
+ virtual std::string operator()(const std::string& name) const
+ {
+ const ResourceManager* res = PageManager::GetResources();
+ if (res)
+ return res->FindString(name);
+ return name;
+ }
+};
+ResourceLookup resourceLookup;
+
+
+/*
+DataManager lookup
+*/
+class DataLookup : public StringLookup
+{
+public:
+ virtual std::string operator()(const std::string& name) const
+ {
+ std::string value;
+ if (DataManager::GetValue(name, value) == 0)
+ return value;
+ else
+ return "";
+ }
+};
+DataLookup dataLookup;
+
+
+// Utility functions to create messages. Short names to make usage convenient.
+Message Msg(const char* name)
+{
+ return Message(msg::kNormal, name, resourceLookup, dataLookup);
+}
+
+Message Msg(msg::Kind kind, const char* name)
+{
+ return Message(kind, name, resourceLookup, dataLookup);
+}
diff --git a/gui/twmsg.h b/gui/twmsg.h
new file mode 100644
index 0000000..cd035d1
--- /dev/null
+++ b/gui/twmsg.h
@@ -0,0 +1,97 @@
+/*
+ Copyright 2015 _that/TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef twmsg_h
+#define twmsg_h
+
+#include <cstdlib>
+#include <cstring>
+#include <string>
+#include <sstream>
+#include <vector>
+#include <errno.h>
+
+/*
+Abstract interface for something that can look up strings by name.
+*/
+class StringLookup
+{
+public:
+ virtual std::string operator()(const std::string& name) const = 0;
+ virtual ~StringLookup() {};
+};
+
+
+namespace msg
+{
+ // These get translated to colors in the GUI console
+ enum Kind
+ {
+ kNormal,
+ kHighlight,
+ kWarning,
+ kError
+ };
+
+
+ template<typename T> std::string to_string(const T& v)
+ {
+ std::ostringstream ss;
+ ss << v;
+ return ss.str();
+ }
+}
+
+
+/*
+Generic message formatting class.
+Designed to decouple message generation from actual resource string lookup and variable insertion,
+so that messages can be re-translated at any later time.
+*/
+class Message
+{
+ msg::Kind kind; // severity or similar message kind
+ std::string name; // the resource string name. may be of format "name=default value".
+ std::vector<std::string> variables; // collected insertion variables to replace {1}, {2}, ...
+ const StringLookup& resourceLookup; // object to resolve resource string name into a final format string
+ const StringLookup& varLookup; // object to resolve any non-numeric insertion strings
+
+ std::string GetFormatString(const std::string& name) const;
+
+public:
+ Message(msg::Kind kind, const char* name, const StringLookup& resourceLookup, const StringLookup& varLookup)
+ : kind(kind), name(name), resourceLookup(resourceLookup), varLookup(varLookup) {}
+
+ // Variable insertion.
+ template<typename T>
+ Message& operator()(const T& v) { variables.push_back(msg::to_string(v)); return *this; }
+
+ // conversion to final string
+ operator std::string() const;
+
+ // Get Message Kind
+ msg::Kind GetKind() {return kind;};
+};
+
+
+// Utility functions to create messages with standard resource and data manager lookups.
+// Short names to make usage convenient.
+Message Msg(const char* name);
+Message Msg(msg::Kind kind, const char* name);
+
+#endif
diff --git a/openrecoveryscript.cpp b/openrecoveryscript.cpp
index cf24cba..ebf7654 100644
--- a/openrecoveryscript.cpp
+++ b/openrecoveryscript.cpp
@@ -40,6 +40,7 @@
#include "data.hpp"
#include "adb_install.h"
#include "fuse_sideload.h"
+#include "gui/gui.hpp"
extern "C" {
#include "twinstall.h"
#include "gui/gui.h"
@@ -51,7 +52,8 @@
int OpenRecoveryScript::check_for_script_file(void) {
if (!PartitionManager.Mount_By_Path(SCRIPT_FILE_CACHE, false)) {
- LOGERR("Unable to mount /cache for OpenRecoveryScript support.\n");
+ LOGINFO("Unable to mount /cache for OpenRecoveryScript support.\n");
+ gui_msg(Msg(msg::kError, "unable_to_mount=Unable to mount {1}")(SCRIPT_FILE_CACHE));
return 0;
}
if (TWFunc::Path_Exists(SCRIPT_FILE_CACHE)) {
@@ -134,24 +136,18 @@
} else if (strcmp(command, "wipe") == 0) {
// Wipe
if (strcmp(value, "cache") == 0 || strcmp(value, "/cache") == 0) {
- gui_print("-- Wiping Cache Partition...\n");
PartitionManager.Wipe_By_Path("/cache");
- gui_print("-- Cache Partition Wipe Complete!\n");
} else if (strcmp(value, "dalvik") == 0 || strcmp(value, "dalvick") == 0 || strcmp(value, "dalvikcache") == 0 || strcmp(value, "dalvickcache") == 0) {
- gui_print("-- Wiping Dalvik Cache...\n");
PartitionManager.Wipe_Dalvik_Cache();
- gui_print("-- Dalvik Cache Wipe Complete!\n");
} else if (strcmp(value, "data") == 0 || strcmp(value, "/data") == 0 || strcmp(value, "factory") == 0 || strcmp(value, "factoryreset") == 0) {
- gui_print("-- Wiping Data Partition...\n");
PartitionManager.Factory_Reset();
- gui_print("-- Data Partition Wipe Complete!\n");
} else {
LOGERR("Error with wipe command value: '%s'\n", value);
ret_val = 1;
}
} else if (strcmp(command, "backup") == 0) {
// Backup
- DataManager::SetValue("tw_action_text2", "Backing Up");
+ DataManager::SetValue("tw_action_text2", gui_parse_text("{@backing}"));
tok = strtok(value, " ");
strcpy(value1, tok);
tok = strtok(NULL, " ");
@@ -168,7 +164,7 @@
remove_nl = 0;
strncpy(value2, tok, line_len - remove_nl);
DataManager::SetValue(TW_BACKUP_NAME, value2);
- gui_print("Backup folder set to '%s'\n", value2);
+ gui_msg(Msg("backup_folder=Backup folder set to '{1}'")(value2));
if (PartitionManager.Check_Backup_Name(true) != 0) {
ret_val = 1;
continue;
@@ -181,7 +177,7 @@
ret_val = Backup_Command(value1);
} else if (strcmp(command, "restore") == 0) {
// Restore
- DataManager::SetValue("tw_action_text2", "Restoring");
+ DataManager::SetValue("tw_action_text2", gui_parse_text("{@restore}"));
PartitionManager.Mount_All_Storage();
DataManager::SetValue(TW_SKIP_MD5_CHECK_VAR, 0);
char folder_path[512], partitions[512];
@@ -198,7 +194,7 @@
}
strcpy(folder_path, restore_folder.c_str());
LOGINFO("Restore folder is: '%s' and partitions: '%s'\n", folder_path, partitions);
- gui_print("Restoring '%s'\n", folder_path);
+ gui_msg(Msg("restoring=Restoring {1}...")(folder_path));
if (folder_path[0] != '/') {
char backup_folder[512];
@@ -225,7 +221,7 @@
strcat(folder_path, "/.");
}
if (!TWFunc::Path_Exists(folder_path)) {
- gui_print("Unable to locate backup '%s'\n", folder_path);
+ gui_msg(Msg(msg::kError, "locate_backup_err=Unable to locate backup '{1}'")(folder_path));
ret_val = 1;
continue;
}
@@ -241,20 +237,21 @@
memset(value2, 0, sizeof(value2));
strcpy(value2, partitions);
- gui_print("Setting restore options: '%s':\n", value2);
+ gui_msg(Msg("set_restore_opt=Setting restore options: '{1}':")(value2));
line_len = strlen(value2);
for (i=0; i<line_len; i++) {
if ((value2[i] == 'S' || value2[i] == 's') && Partition_List.find("/system;") != string::npos) {
Restore_List += "/system;";
- gui_print("System\n");
+ gui_msg("system=System");
} else if ((value2[i] == 'D' || value2[i] == 'd') && Partition_List.find("/data;") != string::npos) {
Restore_List += "/data;";
- gui_print("Data\n");
+ gui_msg("data=Data");
} else if ((value2[i] == 'C' || value2[i] == 'c') && Partition_List.find("/cache;") != string::npos) {
Restore_List += "/cache;";
- gui_print("Cache\n");
+ gui_msg("cache=Cache");
} else if ((value2[i] == 'R' || value2[i] == 'r') && Partition_List.find("/recovery;") != string::npos) {
- gui_print("Recovery -- Not allowed to restore recovery\n");
+ Restore_List += "/recovery;";
+ gui_msg("recovery=Recovery");
} else if (value2[i] == '1' && DataManager::GetIntValue(TW_RESTORE_SP1_VAR) > 0) {
gui_print("%s\n", "Special1 -- No Longer Supported...");
} else if (value2[i] == '2' && DataManager::GetIntValue(TW_RESTORE_SP2_VAR) > 0) {
@@ -263,16 +260,16 @@
gui_print("%s\n", "Special3 -- No Longer Supported...");
} else if ((value2[i] == 'B' || value2[i] == 'b') && Partition_List.find("/boot;") != string::npos) {
Restore_List += "/boot;";
- gui_print("Boot\n");
+ gui_msg("boot=Boot");
} else if ((value2[i] == 'A' || value2[i] == 'a') && Partition_List.find("/and-sec;") != string::npos) {
Restore_List += "/and-sec;";
- gui_print("Android Secure\n");
+ gui_msg("android_secure=Android Secure");
} else if ((value2[i] == 'E' || value2[i] == 'e') && Partition_List.find("/sd-ext;") != string::npos) {
Restore_List += "/sd-ext;";
- gui_print("SD-Ext\n");
+ gui_msg("sdext=SD-EXT");
} else if (value2[i] == 'M' || value2[i] == 'm') {
DataManager::SetValue(TW_SKIP_MD5_CHECK_VAR, 1);
- gui_print("MD5 check skip is on\n");
+ gui_msg("md5_check_skip=MD5 check skip is on");
}
}
@@ -281,32 +278,32 @@
DataManager::SetValue("tw_restore_selected", Partition_List);
}
if (is_encrypted) {
- LOGERR("Unable to use OpenRecoveryScript to restore an encrypted backup.\n");
+ gui_err("ors_encrypt_restore_err=Unable to use OpenRecoveryScript to restore an encrypted backup.");
ret_val = 1;
} else if (!PartitionManager.Run_Restore(folder_path))
ret_val = 1;
else
- gui_print("Restore complete!\n");
+ gui_msg("done=Done.");
} else if (strcmp(command, "mount") == 0) {
// Mount
- DataManager::SetValue("tw_action_text2", "Mounting");
+ DataManager::SetValue("tw_action_text2", gui_parse_text("{@mounting}"));
if (value[0] != '/') {
strcpy(mount, "/");
strcat(mount, value);
} else
strcpy(mount, value);
if (PartitionManager.Mount_By_Path(mount, true))
- gui_print("Mounted '%s'\n", mount);
+ gui_msg(Msg("mounted=Mounted '{1}'")(mount));
} else if (strcmp(command, "unmount") == 0 || strcmp(command, "umount") == 0) {
// Unmount
- DataManager::SetValue("tw_action_text2", "Unmounting");
+ DataManager::SetValue("tw_action_text2", gui_parse_text("{@unmounting}"));
if (value[0] != '/') {
strcpy(mount, "/");
strcat(mount, value);
} else
strcpy(mount, value);
if (PartitionManager.UnMount_By_Path(mount, true))
- gui_print("Unmounted '%s'\n", mount);
+ gui_msg(Msg("unmounted=Unounted '{1}'")(mount));
} else if (strcmp(command, "set") == 0) {
// Set value
size_t len = strlen(value);
@@ -314,18 +311,18 @@
strcpy(value1, tok);
if (len > strlen(value1) + 1) {
char *val2 = value + strlen(value1) + 1;
- gui_print("Setting '%s' to '%s'\n", value1, val2);
+ gui_msg(Msg("setting=Setting '{1}' to '{2}'")(value1)(val2));
DataManager::SetValue(value1, val2);
} else {
- gui_print("Setting '%s' to empty\n", value1);
+ gui_msg(Msg("setting_empty=Setting '{1}' to empty")(value1));
DataManager::SetValue(value1, "");
}
} else if (strcmp(command, "mkdir") == 0) {
// Make directory (recursive)
- DataManager::SetValue("tw_action_text2", "Making Directory");
- gui_print("Making directory (recursive): '%s'\n", value);
+ DataManager::SetValue("tw_action_text2", gui_parse_text("{@making_dir1}"));
+ gui_msg(Msg("making_dir2=Making directory: '{1}'")(value));
if (TWFunc::Recursive_Mkdir(value)) {
- LOGERR("Unable to create folder: '%s'\n", value);
+ gui_msg(Msg(msg::kError, "create_folder_strerr=Can not create '{1}' folder ({2}).")(value)(strerror(errno)));
ret_val = 1;
}
} else if (strcmp(command, "reboot") == 0) {
@@ -340,7 +337,7 @@
else
TWFunc::tw_reboot(rb_system);
} else if (strcmp(command, "cmd") == 0) {
- DataManager::SetValue("tw_action_text2", "Running Command");
+ DataManager::SetValue("tw_action_text2", gui_parse_text("{@running_command}"));
if (cindex != 0) {
TWFunc::Exec_Cmd(value);
} else {
@@ -350,18 +347,18 @@
gui_print("%s\n", value);
} else if (strcmp(command, "sideload") == 0) {
// ADB Sideload
- DataManager::SetValue("tw_action_text2", "ADB Sideload");
+ DataManager::SetValue("tw_action_text2", gui_parse_text("{@sideload}"));
install_cmd = -1;
int wipe_cache = 0;
string result;
pid_t sideload_child_pid;
- gui_print("Starting ADB sideload feature...\n");
+ gui_msg("start_sideload=Starting ADB sideload feature...");
ret_val = apply_from_adb("/", &sideload_child_pid);
if (ret_val != 0) {
if (ret_val == -2)
- gui_print("You need adb 1.0.32 or newer to sideload to this device.\n");
+ gui_err("need_new_adb=You need adb 1.0.32 or newer to sideload to this device.");
ret_val = 1; // failure
} else if (TWinstall_zip(FUSE_SIDELOAD_HOST_PATHNAME, &wipe_cache) == 0) {
if (wipe_cache)
@@ -381,7 +378,7 @@
waitpid(sideload_child_pid, &status, 0);
}
property_set("ctl.start", "adbd");
- gui_print("Sideload finished.\n");
+ gui_msg("done=Done.");
} else if (strcmp(command, "fixperms") == 0 || strcmp(command, "fixpermissions") == 0) {
ret_val = PartitionManager.Fix_Permissions();
if (ret_val != 0)
@@ -392,7 +389,7 @@
if (ret_val != 0)
ret_val = 1; // failure
} else {
- LOGERR("No password provided.\n");
+ gui_err("no_pwd=No password provided.");
ret_val = 1; // failure
}
} else {
@@ -401,13 +398,13 @@
}
}
fclose(fp);
- gui_print("Done processing script file\n");
+ gui_msg("done_ors=Done processing script file");
} else {
- LOGERR("Error opening script file '%s'\n", SCRIPT_FILE_TMP);
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(SCRIPT_FILE_TMP)(strerror(errno)));
return 1;
}
if (install_cmd && DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
- gui_print("Injecting TWRP into boot image...\n");
+ gui_msg("injecttwrp=Injecting TWRP into boot image...");
TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
if (Boot == NULL || Boot->Current_File_System != "emmc")
TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
@@ -415,7 +412,7 @@
string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
TWFunc::Exec_Cmd(injectcmd.c_str());
}
- gui_print("TWRP injection complete.\n");
+ gui_msg("done=Done.");
}
if (sideload)
ret_val = 1; // Forces booting to the home page after sideload
@@ -447,10 +444,12 @@
// This is a special file that contains a map of blocks on the data partition
Full_Path = Zip.substr(1);
if (!PartitionManager.Mount_By_Path(Full_Path, true) || !TWFunc::Path_Exists(Full_Path)) {
- gui_print("Unable to install via mapped zip '%s'\n", Full_Path.c_str());
+ LOGINFO("Unable to install via mapped zip '%s'\n", Full_Path.c_str());
+ gui_msg(Msg(msg::kError, "zip_err=Error installing zip file '{1}'")(Zip));
return 1;
}
- gui_print("Installing mapped zip file '%s'\n", Full_Path.c_str());
+ LOGINFO("Installing mapped zip file '%s'\n", Full_Path.c_str());
+ gui_msg(Msg("installing_zip=Installing zip file '{1}'")(Zip));
} else if (!TWFunc::Path_Exists(Zip)) {
PartitionManager.Mount_All_Storage();
PartitionManager.Get_Partition_List("storage", &Storage_List);
@@ -476,12 +475,12 @@
gui_print("Unable to locate zip file '%s'.\n", Zip.c_str());
ret_val = 1;
} else
- gui_print("Installing zip file '%s'\n", Zip.c_str());
+ gui_msg(Msg("installing_zip=Installing zip file '{1}'")(Zip));
}
ret_val = TWinstall_zip(Zip.c_str(), &wipe_cache);
if (ret_val != 0) {
- LOGERR("Error installing zip file '%s'\n", Zip.c_str());
+ gui_msg(Msg(msg::kError, "zip_err=Error installing zip file '{1}'")(Zip));
ret_val = 1;
} else if (wipe_cache)
PartitionManager.Wipe_By_Path("/cache");
@@ -523,21 +522,21 @@
DataManager::SetValue(TW_USE_COMPRESSION_VAR, 0);
DataManager::SetValue(TW_SKIP_MD5_GENERATE_VAR, 0);
- gui_print("Setting backup options:\n");
+ gui_msg("select_backup_opt=Setting backup options:");
line_len = Options.size();
for (i=0; i<line_len; i++) {
if (Options.substr(i, 1) == "S" || Options.substr(i, 1) == "s") {
Backup_List += "/system;";
- gui_print("System\n");
+ gui_msg("system=System");
} else if (Options.substr(i, 1) == "D" || Options.substr(i, 1) == "d") {
Backup_List += "/data;";
- gui_print("Data\n");
+ gui_msg("data=Data");
} else if (Options.substr(i, 1) == "C" || Options.substr(i, 1) == "c") {
Backup_List += "/cache;";
- gui_print("Cache\n");
+ gui_msg("cache=Cache");
} else if (Options.substr(i, 1) == "R" || Options.substr(i, 1) == "r") {
Backup_List += "/recovery;";
- gui_print("Recovery\n");
+ gui_msg("recovery=Recovery");
} else if (Options.substr(i, 1) == "1") {
gui_print("%s\n", "Special1 -- No Longer Supported...");
} else if (Options.substr(i, 1) == "2") {
@@ -546,27 +545,27 @@
gui_print("%s\n", "Special3 -- No Longer Supported...");
} else if (Options.substr(i, 1) == "B" || Options.substr(i, 1) == "b") {
Backup_List += "/boot;";
- gui_print("Boot\n");
+ gui_msg("boot=Boot");
} else if (Options.substr(i, 1) == "A" || Options.substr(i, 1) == "a") {
Backup_List += "/and-sec;";
- gui_print("Android Secure\n");
+ gui_msg("android_secure=Android Secure");
} else if (Options.substr(i, 1) == "E" || Options.substr(i, 1) == "e") {
Backup_List += "/sd-ext;";
- gui_print("SD-Ext\n");
+ gui_msg("sdext=SD-EXT");
} else if (Options.substr(i, 1) == "O" || Options.substr(i, 1) == "o") {
DataManager::SetValue(TW_USE_COMPRESSION_VAR, 1);
- gui_print("Compression is on\n");
+ gui_msg("compression_on=Compression is on");
} else if (Options.substr(i, 1) == "M" || Options.substr(i, 1) == "m") {
DataManager::SetValue(TW_SKIP_MD5_GENERATE_VAR, 1);
- gui_print("MD5 Generation is off\n");
+ gui_msg("md5_off=MD5 Generation is off");
}
}
DataManager::SetValue("tw_backup_list", Backup_List);
if (!PartitionManager.Run_Backup()) {
- LOGERR("Backup failed!\n");
+ gui_err("backup_fail=Backup Failed");
return 1;
}
- gui_print("Backup complete!\n");
+ gui_msg("backup_complete=Backup complete!");
return 0;
}
@@ -577,11 +576,11 @@
DataManager::SetValue("tw_action2", "");
DataManager::SetValue("tw_action2_param", "");
#ifdef TW_OEM_BUILD
- DataManager::SetValue("tw_action_text1", "Running Recovery Commands");
- DataManager::SetValue("tw_complete_text1", "Recovery Commands Complete");
+ DataManager::SetValue("tw_action_text1", gui_lookup("running_recovery_commands", "Running Recovery Commands"));
+ DataManager::SetValue("tw_complete_text1", gui_lookup("recovery_commands_complete", "Recovery Commands Complete"));
#else
- DataManager::SetValue("tw_action_text1", "Running OpenRecoveryScript");
- DataManager::SetValue("tw_complete_text1", "OpenRecoveryScript Complete");
+ DataManager::SetValue("tw_action_text1", gui_lookup("running_ors", "Running OpenRecoveryScript"));
+ DataManager::SetValue("tw_complete_text1", gui_lookup("ors_complete", "OpenRecoveryScript Complete"));
#endif
DataManager::SetValue("tw_action_text2", "");
DataManager::SetValue("tw_has_cancel", 0);
diff --git a/partition.cpp b/partition.cpp
index f6adec9..df408e6 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -43,6 +43,7 @@
#include "fixPermissions.hpp"
#include "infomanager.hpp"
#include "set_metadata.h"
+#include "gui/gui.hpp"
extern "C" {
#include "mtdutils/mtdutils.h"
#include "mtdutils/mounts.h"
@@ -299,7 +300,7 @@
DataManager::SetValue(TW_CRYPTO_PASSWORD, "");
DataManager::SetValue("tw_crypto_display", "");
} else {
- LOGERR("Could not mount /data and unable to find crypto footer.\n");
+ gui_err("mount_data_footer=Could not mount /data and unable to find crypto footer.");
}
} else {
LOGERR("Primary block device '%s' for mount point '%s' is not present!\n", Primary_Block_Device.c_str(), Mount_Point.c_str());
@@ -642,7 +643,7 @@
if (!TWFunc::Path_Exists(Path)) {
if (mkdir(Path.c_str(), 0777) == -1) {
if (Display_Error)
- LOGERR("Can not create '%s' folder.\n", Path.c_str());
+ gui_msg(Msg(msg::kError, "create_folder_strerr=Can not create '{1}' folder ({2}).")(Path)(strerror(errno)));
else
LOGINFO("Can not create '%s' folder.\n", Path.c_str());
return false;
@@ -1011,7 +1012,7 @@
if (mount(Actual_Block_Device.c_str(), Mount_Point.c_str(), Fstab_File_System.c_str(), flags, NULL) < 0) {
if (mount(Actual_Block_Device.c_str(), Mount_Point.c_str(), Fstab_File_System.c_str(), flags | MS_RDONLY, NULL) < 0) {
if (Display_Error)
- LOGERR("Failed to mount '%s' (MTD)\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "fail_mount=Failed to mount '{1}' ({2})")(Mount_Point)(strerror(errno)));
else
LOGINFO("Failed to mount '%s' (MTD)\n", Mount_Point.c_str());
return false;
@@ -1024,7 +1025,7 @@
string test_path = Mount_Point;
if (stat(test_path.c_str(), &st) < 0) {
if (Display_Error)
- LOGERR("Failed to mount '%s' (MTD)\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "fail_mount=Failed to mount '{1}' ({2})")(Mount_Point)(strerror(errno)));
else
LOGINFO("Failed to mount '%s' (MTD)\n", Mount_Point.c_str());
return false;
@@ -1056,7 +1057,7 @@
LOGINFO("Mounting exfat failed, trying vfat...\n");
if (mount(Actual_Block_Device.c_str(), Mount_Point.c_str(), "vfat", 0, NULL) != 0) {
if (Display_Error)
- LOGERR("Unable to mount '%s'\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "fail_mount=Failed to mount '{1}' ({2})")(Mount_Point)(strerror(errno)));
else
LOGINFO("Unable to mount '%s'\n", Mount_Point.c_str());
LOGINFO("Actual block device: '%s', current file system: '%s', flags: 0x%8x, options: '%s'\n", Actual_Block_Device.c_str(), Current_File_System.c_str(), flags, Mount_Options.c_str());
@@ -1065,7 +1066,7 @@
} else {
#endif
if (!Removable && Display_Error)
- LOGERR("Unable to mount '%s'\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "fail_mount=Failed to mount '{1}' ({2})")(Mount_Point)(strerror(errno)));
else
LOGINFO("Unable to mount '%s'\n", Mount_Point.c_str());
LOGINFO("Actual block device: '%s', current file system: '%s'\n", Actual_Block_Device.c_str(), Current_File_System.c_str());
@@ -1102,7 +1103,7 @@
umount(Mount_Point.c_str());
if (Is_Mounted()) {
if (Display_Error)
- LOGERR("Unable to unmount '%s'\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "fail_unmount=Failed to unmount '{1}' ({2})")(Mount_Point)(strerror(errno)));
else
LOGINFO("Unable to unmount '%s'\n", Mount_Point.c_str());
return false;
@@ -1120,7 +1121,7 @@
string Layout_Filename = Mount_Point + "/.layout_version";
if (!Can_Be_Wiped) {
- LOGERR("Partition '%s' cannot be wiped.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "cannot_wipe=Partition {1} cannot be wiped.\n")(Display_Name));
return false;
}
@@ -1207,7 +1208,7 @@
if (!Mount(true))
return false;
- gui_print("Wiping %s\n", Backup_Display_Name.c_str());
+ gui_msg(Msg("wiping=Wiping {1}")(Backup_Display_Name));
TWFunc::removeDir(Mount_Point + "/.android_secure/", true);
return true;
}
@@ -1233,96 +1234,96 @@
if (Current_File_System == "vfat") {
if (!TWFunc::Path_Exists("/sbin/fsck.fat")) {
- gui_print("fsck.fat does not exist! Cannot repair!\n");
+ gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("fsck.fat"));
return false;
}
if (!UnMount(true))
return false;
- gui_print("Repairing %s using fsck.fat...\n", Display_Name.c_str());
+ gui_msg(Msg("reparing=Repairing {1} using {2}...")(Display_Name)("fsck.fat"));
Find_Actual_Block_Device();
command = "/sbin/fsck.fat -y " + Actual_Block_Device;
LOGINFO("Repair command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to repair '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_repair=Unable to repair {1}.")(Display_Name));
return false;
}
}
if (Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") {
if (!TWFunc::Path_Exists("/sbin/e2fsck")) {
- gui_print("e2fsck does not exist! Cannot repair!\n");
+ gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("e2fsck"));
return false;
}
if (!UnMount(true))
return false;
- gui_print("Repairing %s using e2fsck...\n", Display_Name.c_str());
+ gui_msg(Msg("reparing=Repairing {1} using {2}...")(Display_Name)("e2fsck"));
Find_Actual_Block_Device();
command = "/sbin/e2fsck -fp " + Actual_Block_Device;
LOGINFO("Repair command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to repair '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_repair=Unable to repair {1}.")(Display_Name));
return false;
}
}
if (Current_File_System == "exfat") {
if (!TWFunc::Path_Exists("/sbin/fsck.exfat")) {
- gui_print("fsck.exfat does not exist! Cannot repair!\n");
+ gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("fsck.exfat"));
return false;
}
if (!UnMount(true))
return false;
- gui_print("Repairing %s using fsck.exfat...\n", Display_Name.c_str());
+ gui_msg(Msg("reparing=Repairing {1} using {2}...")(Display_Name)("fsck.exfat"));
Find_Actual_Block_Device();
command = "/sbin/fsck.exfat " + Actual_Block_Device;
LOGINFO("Repair command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to repair '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_repair=Unable to repair {1}.")(Display_Name));
return false;
}
}
if (Current_File_System == "f2fs") {
if (!TWFunc::Path_Exists("/sbin/fsck.f2fs")) {
- gui_print("fsck.f2fs does not exist! Cannot repair!\n");
+ gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("fsck.f2fs"));
return false;
}
if (!UnMount(true))
return false;
- gui_print("Repairing %s using fsck.f2fs...\n", Display_Name.c_str());
+ gui_msg(Msg("reparing=Repairing {1} using {2}...")(Display_Name)("fsck.f2fs"));
Find_Actual_Block_Device();
command = "/sbin/fsck.f2fs " + Actual_Block_Device;
LOGINFO("Repair command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to repair '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_repair=Unable to repair {1}.")(Display_Name));
return false;
}
}
if (Current_File_System == "ntfs") {
if (!TWFunc::Path_Exists("/sbin/ntfsfix")) {
- gui_print("ntfsfix does not exist! Cannot repair!\n");
+ gui_msg(Msg(msg::kError, "repair_not_exist={1} does not exist! Cannot repair!")("ntfsfix"));
return false;
}
if (!UnMount(true))
return false;
- gui_print("Repairing %s using ntfsfix...\n", Display_Name.c_str());
+ gui_msg(Msg("reparing=Repairing {1} using {2}...")(Display_Name)("ntfsfix"));
Find_Actual_Block_Device();
command = "/sbin/ntfsfix " + Actual_Block_Device;
LOGINFO("Repair command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to repair '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_repair=Unable to repair {1}.")(Display_Name));
return false;
}
}
@@ -1342,18 +1343,20 @@
if (Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") {
if (!Can_Repair()) {
- LOGERR("Cannot resize %s because %s cannot be repaired before resizing.\n", Display_Name.c_str(), Display_Name.c_str());
+ LOGINFO("Cannot resize %s because %s cannot be repaired before resizing.\n", Display_Name.c_str(), Display_Name.c_str());
+ gui_msg(Msg(msg::kError, "cannot_resize=Cannot resize {1}.")(Display_Name));
return false;
}
if (!TWFunc::Path_Exists("/sbin/resize2fs")) {
- gui_print("resize2fs does not exist! Cannot resize!\n");
+ LOGINFO("resize2fs does not exist! Cannot resize!\n");
+ gui_msg(Msg(msg::kError, "cannot_resize=Cannot resize {1}.")(Display_Name));
return false;
}
// Repair will unmount so no need to do it twice
- gui_print("Repairing %s before resizing.\n", Display_Name.c_str());
+ gui_msg(Msg("repair_resize=Repairing {1} before resizing.")( Display_Name));
if (!Repair())
return false;
- gui_print("Resizing %s using resize2fs...\n", Display_Name.c_str());
+ gui_msg(Msg("resizing=Resizing {1} using {2}...")(Display_Name)("resize2fs"));
Find_Actual_Block_Device();
command = "/sbin/resize2fs " + Actual_Block_Device;
if (Length != 0) {
@@ -1362,13 +1365,14 @@
fd = open(Actual_Block_Device.c_str(), O_RDONLY);
if (fd < 0) {
- LOGERR("Resize: Failed to open '%s'\n", Actual_Block_Device.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Actual_Block_Device)(strerror(errno)));
return false;
}
ret = ioctl(fd, BLKGETSIZE, &block_device_size);
close(fd);
if (ret) {
- LOGERR("Resize: ioctl error\n");
+ gui_msg(Msg(msg::kError, "unable_resize=Unable to resize {1}.")(Display_Name));
+ LOGINFO("Resize: ioctl error\n");
return false;
}
unsigned long long Actual_Size = (unsigned long long)(block_device_size) * 512LLU;
@@ -1389,11 +1393,11 @@
LOGINFO("Resize command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
Update_Size(true);
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
Update_Size(true);
- LOGERR("Unable to resize '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_resize=Unable to resize {1}.")(Display_Name));
return false;
}
}
@@ -1429,14 +1433,13 @@
md5file = split_filename;
md5file += ".md5";
if (!TWFunc::Path_Exists(md5file)) {
- LOGERR("No md5 file found for '%s'.\n", split_filename);
- LOGERR("Please unselect Enable MD5 verification to restore.\n");
+ gui_msg(Msg(msg::kError, "no_md5_found=No md5 file found for '{1}'. Please unselect Enable MD5 verification to restore.")(split_filename));
return false;
}
md5sum.setfn(split_filename);
while (index < 1000) {
if (TWFunc::Path_Exists(split_filename) && md5sum.verify_md5digest() != 0) {
- LOGERR("MD5 failed to match on '%s'.\n", split_filename);
+ gui_msg(Msg(msg::kError, "md5_fail_match=MD5 failed to match on '{1}'.")(split_filename));
return false;
}
index++;
@@ -1448,13 +1451,12 @@
// Single file archive
md5file = Full_Filename + ".md5";
if (!TWFunc::Path_Exists(md5file)) {
- LOGERR("No md5 file found for '%s'.\n", Full_Filename.c_str());
- LOGERR("Please unselect Enable MD5 verification to restore.\n");
+ gui_msg(Msg(msg::kError, "no_md5_found=No md5 file found for '{1}'. Please unselect Enable MD5 verification to restore.")(split_filename));
return false;
}
md5sum.setfn(Full_Filename);
if (md5sum.verify_md5digest() != 0) {
- LOGERR("MD5 failed to match on '%s'.\n", Full_Filename.c_str());
+ gui_msg(Msg(msg::kError, "md5_fail_match=MD5 failed to match on '{1}'.")(split_filename));
return false;
} else
return true;
@@ -1465,7 +1467,7 @@
bool TWPartition::Restore(string restore_folder, const unsigned long long *total_restore_size, unsigned long long *already_restored_size) {
string Restore_File_System;
- TWFunc::GUI_Operation_Text(TW_RESTORE_TEXT, Display_Name, "Restoring");
+ TWFunc::GUI_Operation_Text(TW_RESTORE_TEXT, Display_Name, gui_parse_text("{@restoring}"));
LOGINFO("Restore filename is: %s\n", Backup_FileName.c_str());
Restore_File_System = Get_Restore_File_System(restore_folder);
@@ -1591,12 +1593,12 @@
}
DataManager::SetValue(TW_IS_ENCRYPTED, 0);
#ifndef TW_OEM_BUILD
- gui_print("You may need to reboot recovery to be able to use /data again.\n");
+ gui_msg("format_data_msg=You may need to reboot recovery to be able to use /data again.");
#endif
return true;
} else {
Has_Data_Media = Save_Data_Media;
- LOGERR("Unable to format to remove encryption.\n");
+ gui_err("format_data_err=Unable to format to remove encryption.");
if (Has_Data_Media && Mount(false))
PartitionManager.Add_MTP_Storage(MTP_Storage_ID);
return false;
@@ -1639,17 +1641,17 @@
if (TWFunc::Path_Exists("/sbin/mke2fs")) {
string command;
- gui_print("Formatting %s using mke2fs...\n", Display_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("mke2fs"));
Find_Actual_Block_Device();
command = "mke2fs -t " + File_System + " -m 0 " + Actual_Block_Device;
LOGINFO("mke2fs command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
Current_File_System = File_System;
Recreate_AndSec_Folder();
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to wipe '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
}
} else
@@ -1661,7 +1663,8 @@
bool TWPartition::Wipe_EXT4() {
Find_Actual_Block_Device();
if (!Is_Present) {
- LOGERR("Block device not present, cannot wipe %s.\n", Display_Name.c_str());
+ LOGINFO("Block device not present, cannot wipe %s.\n", Display_Name.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
}
if (!UnMount(true))
@@ -1671,7 +1674,7 @@
int ret;
char *secontext = NULL;
- gui_print("Formatting %s using make_ext4fs function.\n", Display_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("make_ext4fs"));
if (!selinux_handle || selabel_lookup(selinux_handle, &secontext, Mount_Point.c_str(), S_IFDIR) < 0) {
LOGINFO("Cannot lookup security context for '%s'\n", Mount_Point.c_str());
@@ -1680,7 +1683,7 @@
ret = make_ext4fs(Actual_Block_Device.c_str(), Length, Mount_Point.c_str(), selinux_handle);
}
if (ret != 0) {
- LOGERR("Unable to wipe '%s' using function call.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
} else {
string sedir = Mount_Point + "/lost+found";
@@ -1693,7 +1696,7 @@
if (TWFunc::Path_Exists("/sbin/make_ext4fs")) {
string Command;
- gui_print("Formatting %s using make_ext4fs...\n", Display_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("make_ext4fs"));
Find_Actual_Block_Device();
Command = "make_ext4fs";
if (!Is_Decrypted && Length != 0) {
@@ -1711,10 +1714,10 @@
if (TWFunc::Exec_Cmd(Command) == 0) {
Current_File_System = "ext4";
Recreate_AndSec_Folder();
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to wipe '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
}
} else
@@ -1730,16 +1733,16 @@
if (!UnMount(true))
return false;
- gui_print("Formatting %s using mkfs.fat...\n", Display_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("mkfs.fat"));
Find_Actual_Block_Device();
command = "mkfs.fat " + Actual_Block_Device;
if (TWFunc::Exec_Cmd(command) == 0) {
Current_File_System = "vfat";
Recreate_AndSec_Folder();
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to wipe '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
}
return true;
@@ -1757,15 +1760,15 @@
if (!UnMount(true))
return false;
- gui_print("Formatting %s using mkexfatfs...\n", Display_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("mkexfatfs"));
Find_Actual_Block_Device();
command = "mkexfatfs " + Actual_Block_Device;
if (TWFunc::Exec_Cmd(command) == 0) {
Recreate_AndSec_Folder();
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to wipe '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
}
return true;
@@ -1777,7 +1780,7 @@
if (!UnMount(true))
return false;
- gui_print("MTD Formatting \"%s\"\n", MTD_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("MTD"));
mtd_scan_partitions();
const MtdPartition* mtd = mtd_find_partition_by_name(MTD_Name.c_str());
@@ -1802,7 +1805,7 @@
}
Current_File_System = "yaffs2";
Recreate_AndSec_Folder();
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
}
@@ -1815,7 +1818,7 @@
if (Is_Storage)
PartitionManager.Remove_MTP_Storage(MTP_Storage_ID);
- gui_print("Removing all files under '%s'\n", Mount_Point.c_str());
+ gui_msg(Msg("remove_all=Removing all files under '{1}'")(Mount_Point));
TWFunc::removeDir(Mount_Point, true);
Recreate_AndSec_Folder();
return true;
@@ -1828,7 +1831,7 @@
if (!UnMount(true))
return false;
- gui_print("Formatting %s using mkfs.f2fs...\n", Display_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("mkfs.f2fs"));
Find_Actual_Block_Device();
command = "mkfs.f2fs -t 1";
if (!Is_Decrypted && Length != 0) {
@@ -1844,15 +1847,15 @@
command += " " + Actual_Block_Device;
if (TWFunc::Exec_Cmd(command) == 0) {
Recreate_AndSec_Folder();
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to wipe '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
}
return true;
} else {
- gui_print("mkfs.f2fs binary not found, using rm -rf to wipe.\n");
+ LOGINFO("mkfs.f2fs binary not found, using rm -rf to wipe.\n");
return Wipe_RMRF();
}
return false;
@@ -1865,15 +1868,15 @@
if (!UnMount(true))
return false;
- gui_print("Formatting %s using mkntfs...\n", Display_Name.c_str());
+ gui_msg(Msg("formating_using=Formatting {1} using {2}...")(Display_Name)("mkntfs"));
Find_Actual_Block_Device();
command = "mkntfs " + Actual_Block_Device;
if (TWFunc::Exec_Cmd(command) == 0) {
Recreate_AndSec_Folder();
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
} else {
- LOGERR("Unable to wipe '%s'.\n", Mount_Point.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_wipe=Unable to wipe {1}.")(Display_Name));
return false;
}
return true;
@@ -1892,7 +1895,7 @@
if (!Mount(true))
return false;
- gui_print("Wiping data without wiping /data/media ...\n");
+ gui_msg("wiping_data=Wiping data without wiping /data/media ...");
DIR* d;
d = opendir("/data");
@@ -1917,10 +1920,10 @@
}
closedir(d);
- gui_print("Done.\n");
+ gui_msg("done=Done.");
return true;
}
- gui_print("Dirent failed to open /data, error!\n");
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Mount_Point)(strerror(errno)));
return false;
#endif // ifdef TW_OEM_BUILD
}
@@ -1938,7 +1941,7 @@
return false;
TWFunc::GUI_Operation_Text(TW_BACKUP_TEXT, Backup_Display_Name, "Backing Up");
- gui_print("Backing up %s...\n", Backup_Display_Name.c_str());
+ gui_msg(Msg("backing_up=Backing up {1}...")(Backup_Display_Name));
DataManager::GetValue(TW_USE_COMPRESSION_VAR, use_compression);
tar.use_compression = use_compression;
@@ -1989,8 +1992,8 @@
sprintf(block_size, "%llu", DD_Block_Size);
DD_BS = block_size;
- TWFunc::GUI_Operation_Text(TW_BACKUP_TEXT, Display_Name, "Backing Up");
- gui_print("Backing up %s...\n", Display_Name.c_str());
+ TWFunc::GUI_Operation_Text(TW_BACKUP_TEXT, Display_Name, gui_parse_text("{@backing}"));
+ gui_msg(Msg("backing_up=Backing up {1}...")(Backup_Display_Name));
sprintf(back_name, "%s.%s.win", Backup_Name.c_str(), Current_File_System.c_str());
Backup_FileName = back_name;
@@ -2002,7 +2005,7 @@
TWFunc::Exec_Cmd(Command);
tw_set_default_metadata(Full_FileName.c_str());
if (TWFunc::Get_File_Size(Full_FileName) == 0) {
- LOGERR("Backup file size for '%s' is 0 bytes.\n", Full_FileName.c_str());
+ gui_msg(Msg(msg::kError, "backup_size=Backup file size for '{1}' is 0 bytes.")(Full_FileName));
return false;
}
return true;
@@ -2013,8 +2016,8 @@
string Full_FileName, Command;
int use_compression;
- TWFunc::GUI_Operation_Text(TW_BACKUP_TEXT, Display_Name, "Backing Up");
- gui_print("Backing up %s...\n", Display_Name.c_str());
+ TWFunc::GUI_Operation_Text(TW_BACKUP_TEXT, Display_Name, gui_parse_text("{@backing}"));
+ gui_msg(Msg("backing_up=Backing up {1}...")(Backup_Display_Name));
sprintf(back_name, "%s.%s.win", Backup_Name.c_str(), Current_File_System.c_str());
Backup_FileName = back_name;
@@ -2027,7 +2030,7 @@
tw_set_default_metadata(Full_FileName.c_str());
if (TWFunc::Get_File_Size(Full_FileName) == 0) {
// Actual size may not match backup size due to bad blocks on MTD devices so just check for 0 bytes
- LOGERR("Backup file size for '%s' is 0 bytes.\n", Full_FileName.c_str());
+ gui_msg(Msg(msg::kError, "backup_size=Backup file size for '%s' is 0 bytes.")(Full_FileName));
return false;
}
return true;
@@ -2076,10 +2079,9 @@
if (!Wipe_AndSec())
return false;
} else {
- gui_print("Wiping %s...\n", Display_Name.c_str());
+ gui_msg(Msg("wiping=Wiping {1}")(Backup_Display_Name));
if (Has_Data_Media && Mount_Point == "/data" && Restore_File_System != Current_File_System) {
- gui_print("WARNING: This /data backup was made with %s file system!\n", Restore_File_System.c_str());
- gui_print("The backup may not boot unless you change back to %s.\n", Restore_File_System.c_str());
+ gui_msg(Msg(msg::kWarning, "datamedia_fs_restore=WARNING: This /data backup was made with {1} file system! The backup may not boot unless you change back to {1}.")(Restore_File_System));
if (!Wipe_Data_Without_Wiping_Media())
return false;
} else {
@@ -2087,8 +2089,8 @@
return false;
}
}
- TWFunc::GUI_Operation_Text(TW_RESTORE_TEXT, Backup_Display_Name, "Restoring");
- gui_print("Restoring %s...\n", Backup_Display_Name.c_str());
+ TWFunc::GUI_Operation_Text(TW_RESTORE_TEXT, Backup_Display_Name, gui_parse_text("{@restore}"));
+ gui_msg(Msg("restoring=Restoring {1}...")(Backup_Display_Name));
if (!Mount(true))
return false;
@@ -2135,7 +2137,8 @@
double display_percent, progress_percent;
char size_progress[1024];
- TWFunc::GUI_Operation_Text(TW_RESTORE_TEXT, Display_Name, "Restoring");
+ TWFunc::GUI_Operation_Text(TW_RESTORE_TEXT, Backup_Display_Name, gui_parse_text("{@restore}"));
+ gui_msg(Msg("restoring=Restoring {1}...")(Backup_Display_Name));
Full_FileName = restore_folder + "/" + Backup_FileName;
if (Restore_File_System == "emmc") {
@@ -2226,7 +2229,7 @@
string Command;
if (!Mount(true)) {
- LOGERR("Unable to recreate /data/media folder.\n");
+ gui_msg(Msg(msg::kError, "recreate_folder_err=Unable to recreate {1} folder.")("/data/media"));
} else if (!TWFunc::Path_Exists("/data/media")) {
PartitionManager.Mount_By_Path(Symlink_Mount_Point, true);
LOGINFO("Recreating /data/media folder.\n");
@@ -2258,7 +2261,7 @@
return;
LOGINFO("Creating %s: %s\n", Backup_Display_Name.c_str(), Symlink_Path.c_str());
if (!Mount(true)) {
- LOGERR("Unable to recreate %s folder.\n", Backup_Name.c_str());
+ gui_msg(Msg(msg::kError, "recreate_folder_err=Unable to recreate {1} folder.")(Backup_Name));
} else if (!TWFunc::Path_Exists(Symlink_Path)) {
LOGINFO("Recreating %s folder.\n", Backup_Name.c_str());
PartitionManager.Mount_By_Path(Symlink_Mount_Point, true);
@@ -2308,8 +2311,9 @@
}
unsigned long long image_size = TWFunc::Get_File_Size(Filename);
if (image_size > Size) {
- LOGERR("Size (%llu bytes) of image '%s' is larger than target device '%s' (%llu bytes)\n",
+ LOGINFO("Size (%llu bytes) of image '%s' is larger than target device '%s' (%llu bytes)\n",
image_size, Filename.c_str(), Actual_Block_Device.c_str(), Size);
+ gui_err("img_size_err=Size of image is larger than target device");
return false;
}
if (Backup_Method == DD)
@@ -2325,7 +2329,7 @@
bool TWPartition::Flash_Image_DD(string Filename) {
string Command;
- gui_print("Flashing %s...\n", Display_Name.c_str());
+ gui_msg(Msg("flashing=Flashing {1}...")(Display_Name));
Command = "dd bs=8388608 if='" + Filename + "' of=" + Actual_Block_Device;
LOGINFO("Flash command: '%s'\n", Command.c_str());
TWFunc::Exec_Cmd(Command);
@@ -2335,7 +2339,7 @@
bool TWPartition::Flash_Image_FI(string Filename) {
string Command;
- gui_print("Flashing %s...\n", Display_Name.c_str());
+ gui_msg(Msg("flashing=Flashing {1}...")(Display_Name));
// Sometimes flash image doesn't like to flash due to the first 2KB matching, so we erase first to ensure that it flashes
Command = "erase_image " + MTD_Name;
LOGINFO("Erase command: '%s'\n", Command.c_str());
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index 945a96c..cd2cde7 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -40,6 +40,7 @@
#include "twrpDU.hpp"
#include "set_metadata.h"
#include "tw_atomic.hpp"
+#include "gui/gui.hpp"
#ifdef TW_HAS_MTP
#include "mtp/mtp_MtpServer.hpp"
@@ -49,6 +50,7 @@
extern "C" {
#include "cutils/properties.h"
+ #include "gui/gui.h"
}
#ifdef TW_INCLUDE_CRYPTO
@@ -154,11 +156,10 @@
if (password_type == CRYPT_TYPE_DEFAULT) {
LOGINFO("Device is encrypted with the default password, attempting to decrypt.\n");
if (Decrypt_Device("default_password") == 0) {
- gui_print("Successfully decrypted with default password.\n");
+ gui_msg("decrypt_success=Successfully decrypted with default password.");
DataManager::SetValue(TW_IS_ENCRYPTED, 0);
} else {
- LOGERR("Unable to decrypt with default password.");
- LOGERR("You may need to perform a Format Data.\n");
+ gui_err("unable_to_decrypt=Unable to decrypt with default password.");
}
} else {
DataManager::SetValue("TW_CRYPTO_TYPE", password_type);
@@ -342,7 +343,7 @@
if (found) {
return ret;
} else if (Display_Error) {
- LOGERR("Mount: Unable to find partition for path '%s'\n", Local_Path.c_str());
+ gui_msg(Msg(msg::kError, "unable_find_part_path=Unable to find partition for path '{1}'")(Local_Path));
} else {
LOGINFO("Mount: Unable to find partition for path '%s'\n", Local_Path.c_str());
}
@@ -367,7 +368,7 @@
if (found) {
return ret;
} else if (Display_Error) {
- LOGERR("UnMount: Unable to find partition for path '%s'\n", Local_Path.c_str());
+ gui_msg(Msg(msg::kError, "unable_find_part_path=Unable to find partition for path '{1}'")(Local_Path));
} else {
LOGINFO("UnMount: Unable to find partition for path '%s'\n", Local_Path.c_str());
}
@@ -425,7 +426,7 @@
// Check size
if (copy_size > MAX_BACKUP_NAME_LEN) {
if (Display_Error)
- LOGERR("Backup name is too long.\n");
+ gui_err("backup_name_len=Backup name is too long.");
return -2;
}
@@ -444,7 +445,7 @@
// and -_.{}[]
} else {
if (Display_Error)
- LOGERR("Backup name '%s' contains invalid character: '%c'\n", backup_name, (char)cur_char);
+ gui_msg(Msg(msg::kError, "backup_name_invalid=Backup name '{1}' contains invalid character: '{1}'")(backup_name)((char)cur_char));
return -3;
}
}
@@ -455,7 +456,7 @@
sprintf(tw_image_dir,"%s/%s", backup_loc, Backup_Name.c_str());
if (TWFunc::Path_Exists(tw_image_dir)) {
if (Display_Error)
- LOGERR("A backup with this name already exists.\n");
+ gui_err("backup_name_exists=A backup with this name already exists.");
return -4;
}
// No problems found, return 0
@@ -472,18 +473,18 @@
if (!generate_md5)
return true;
- TWFunc::GUI_Operation_Text(TW_GENERATE_MD5_TEXT, "Generating MD5");
- gui_print(" * Generating md5...\n");
+ TWFunc::GUI_Operation_Text(TW_GENERATE_MD5_TEXT, gui_parse_text("{@generating_md51}"));
+ gui_msg("generating_md52= * Generating md5...");
if (TWFunc::Path_Exists(Full_File)) {
md5sum.setfn(Backup_Folder + Backup_Filename);
if (md5sum.computeMD5() == 0)
if (md5sum.write_md5digest() == 0)
- gui_print(" * MD5 Created.\n");
+ gui_msg("md5_created= * MD5 Created.");
else
return -1;
else
- gui_print(" * MD5 Error!\n");
+ gui_err("md5_error= * MD5 Error!");
} else {
char filename[512];
int index = 0;
@@ -496,11 +497,11 @@
if (md5sum.computeMD5() == 0) {
if (md5sum.write_md5digest() != 0)
{
- gui_print(" * MD5 Error.\n");
+ gui_err("md5_error= * MD5 Error!");
return false;
}
} else {
- gui_print(" * Error computing MD5.\n");
+ gui_err("md5_compute_error= * Error computing MD5.");
return false;
}
}
@@ -512,7 +513,7 @@
LOGERR("Backup file: '%s' not found!\n", filename);
return false;
}
- gui_print(" * MD5 Created.\n");
+ gui_msg("md5_created= * MD5 Created.");
}
return true;
}
@@ -602,10 +603,10 @@
struct dirent *p;
int r;
- gui_print("Backup Failed.\nCleaning Backup Folder\n");
+ gui_msg("backup_clean=Backup Failed. Cleaning Backup Folder.");
if (d == NULL) {
- LOGERR("Error opening dir: '%s'\n", Backup_Folder.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Backup_Folder)(strerror(errno)));
return;
}
@@ -679,9 +680,9 @@
DataManager::GetValue(TW_BACKUPS_FOLDER_VAR, Backup_Folder);
DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
- if (Backup_Name == "(Current Date)") {
+ if (Backup_Name == gui_parse_text("{@current_date}")) {
Backup_Name = TWFunc::Get_Current_Date();
- } else if (Backup_Name == "(Auto Generate)" || Backup_Name == "0" || Backup_Name.empty()) {
+ } else if (Backup_Name == gui_parse_text("{@auto_generate}") || Backup_Name == "0" || Backup_Name.empty()) {
TWFunc::Auto_Generate_Backup_Name();
DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
}
@@ -716,7 +717,7 @@
}
}
} else {
- LOGERR("Unable to locate '%s' partition for backup calculations.\n", backup_path.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_locate_partition=Unable to locate '{1}' partition for backup calculations.")(backup_path));
}
start_pos = end_pos + 1;
end_pos = Backup_List.find(";", start_pos);
@@ -724,18 +725,18 @@
}
if (partition_count == 0) {
- gui_print("No partitions selected for backup.\n");
+ gui_msg("no_partition_selected=No partitions selected for backup.");
return false;
}
total_bytes = file_bytes + img_bytes;
- gui_print(" * Total number of partitions to back up: %d\n", partition_count);
- gui_print(" * Total size of all data: %lluMB\n", total_bytes / 1024 / 1024);
+ gui_msg(Msg("total_partitions_backup= * Total number of partitions to back up: {1}")(partition_count));
+ gui_msg(Msg("total_backup_size= * Total size of all data: {1}MB")(total_bytes / 1024 / 1024));
storage = Find_Partition_By_Path(DataManager::GetCurrentStoragePath());
if (storage != NULL) {
free_space = storage->Free;
- gui_print(" * Available space: %lluMB\n", free_space / 1024 / 1024);
+ gui_msg(Msg("available_space= * Available space: {1}MB")(free_space / 1024 / 1024));
} else {
- LOGERR("Unable to locate storage device.\n");
+ gui_err("unable_locate_storage=Unable to locate storage device.");
return false;
}
@@ -743,17 +744,17 @@
if (!disable_free_space_check) {
if (free_space - (32 * 1024 * 1024) < total_bytes) {
// We require an extra 32MB just in case
- LOGERR("Not enough free space on storage.\n");
+ gui_err("no_space=Not enough free space on storage.");
return false;
}
}
img_bytes_remaining = img_bytes;
file_bytes_remaining = file_bytes;
- gui_print("\n[BACKUP STARTED]\n");
- gui_print(" * Backup Folder: %s\n", Full_Backup_Path.c_str());
+ gui_msg("backup_started=[BACKUP STARTED]");
+ gui_msg(Msg("backup_folder= * Backup Folder: {1}")(Full_Backup_Path));
if (!TWFunc::Recursive_Mkdir(Full_Backup_Path)) {
- LOGERR("Failed to make backup folder.\n");
+ gui_err("fail_backup_folder=Failed to make backup folder.");
return false;
}
@@ -770,7 +771,7 @@
if (!Backup_Partition(backup_part, Full_Backup_Path, do_md5, &img_bytes_remaining, &file_bytes_remaining, &img_time, &file_time, &img_bytes, &file_bytes))
return false;
} else {
- LOGERR("Unable to locate '%s' partition for backup process.\n", backup_path.c_str());
+ gui_msg(Msg(msg::kError, "unable_to_locate_partition=Unable to locate '{1}' partition for backup calculations.")(backup_path));
}
start_pos = end_pos + 1;
end_pos = Backup_List.find(";", start_pos);
@@ -784,8 +785,8 @@
int img_bps = (int)img_bytes / (int)img_time;
unsigned long long file_bps = file_bytes / (int)file_time;
- gui_print("Average backup rate for file systems: %llu MB/sec\n", (file_bps / (1024 * 1024)));
- gui_print("Average backup rate for imaged drives: %lu MB/sec\n", (img_bps / (1024 * 1024)));
+ gui_msg(Msg("avg_backup_fs=Average backup rate for file systems: {1} MB/sec")(file_bps / (1024 * 1024)));
+ gui_msg(Msg("avg_backup_img=Average backup rate for imaged drives: {1} MB/sec")(img_bps / (1024 * 1024)));
time(&total_stop);
int total_time = (int) difftime(total_stop, total_start);
@@ -812,10 +813,10 @@
else
DataManager::SetValue(TW_BACKUP_AVG_FILE_RATE, file_bps);
- gui_print("[%llu MB TOTAL BACKED UP]\n", actual_backup_size);
+ gui_msg(Msg("total_backed_size=[{1} MB TOTAL BACKED UP]")(actual_backup_size));
Update_System_Details();
UnMount_Main_Partitions();
- gui_print_color("highlight", "[BACKUP COMPLETED IN %d SECONDS]\n\n", total_time); // the end
+ gui_msg(Msg(msg::kHighlight, "backup_completed=[BACKUP COMPLETED IN %s SECONDS]")(total_time)); // the end
string backup_log = Full_Backup_Path + "recovery.log";
TWFunc::copy_file("/tmp/recovery.log", backup_log, 0644);
tw_set_default_metadata(backup_log.c_str());
@@ -845,7 +846,7 @@
}
time(&Stop);
TWFunc::SetPerformanceMode(false);
- gui_print("[%s done (%d seconds)]\n\n", Part->Backup_Display_Name.c_str(), (int)difftime(Stop, Start));
+ gui_msg(Msg("restort_part_done=[{1} done ({2} seconds)]")(Part->Backup_Display_Name)((int)difftime(Stop, Start)));
return true;
}
@@ -858,8 +859,8 @@
size_t start_pos = 0, end_pos;
unsigned long long total_restore_size = 0, already_restored_size = 0;
- gui_print("\n[RESTORE STARTED]\n\n");
- gui_print("Restore folder: '%s'\n", Restore_Name.c_str());
+ gui_msg("restore_started=[RESTORE STARTED]");
+ gui_msg(Msg("restore_folder=Restore folder: '{1}'")(Restore_Name));
if (!Mount_Current_Storage(true))
return false;
@@ -867,12 +868,12 @@
DataManager::GetValue(TW_SKIP_MD5_CHECK_VAR, check_md5);
if (check_md5 > 0) {
// Check MD5 files first before restoring to ensure that all of them match before starting a restore
- TWFunc::GUI_Operation_Text(TW_VERIFY_MD5_TEXT, "Verifying MD5");
- gui_print("Verifying MD5...\n");
+ TWFunc::GUI_Operation_Text(TW_VERIFY_MD5_TEXT, gui_parse_text("{@verifying_md5}"));
+ gui_msg("verifying_md5=Verifying MD5");
} else {
- gui_print("Skipping MD5 check based on user setting.\n");
+ gui_msg("skip_md5=Skipping MD5 check based on user setting.");
}
- gui_print("Calculating restore details...\n");
+ gui_msg("calc_restore=Calculating restore details...");
DataManager::GetValue("tw_restore_selected", Restore_List);
if (!Restore_List.empty()) {
end_pos = Restore_List.find(";", start_pos);
@@ -881,7 +882,7 @@
restore_part = Find_Partition_By_Path(restore_path);
if (restore_part != NULL) {
if (restore_part->Mount_Read_Only) {
- LOGERR("Cannot restore %s -- mounted read only.\n", restore_part->Backup_Display_Name.c_str());
+ gui_msg(Msg(msg::kError, "restore_read_only=Cannot restore {1} -- mounted read only.")(restore_part->Backup_Display_Name));
return false;
}
if (check_md5 > 0 && !restore_part->Check_MD5(Restore_Name))
@@ -900,7 +901,7 @@
}
}
} else {
- LOGERR("Unable to locate '%s' partition for restoring (restore list).\n", restore_path.c_str());
+ gui_msg(Msg(msg::kError, "restore_unable_locate=Unable to locate '{1}' partition for restoring.")(restore_path));
}
start_pos = end_pos + 1;
end_pos = Restore_List.find(";", start_pos);
@@ -908,12 +909,12 @@
}
if (partition_count == 0) {
- LOGERR("No partitions selected for restore.\n");
+ gui_err("no_part_restore=No partitions selected for restore.");
return false;
}
- gui_print("Restoring %i partitions...\n", partition_count);
- gui_print("Total restore size is %lluMB\n", total_restore_size / 1048576);
+ gui_msg(Msg("restore_part_count=Restoring {1} partitions...")(partition_count));
+ gui_msg(Msg("total_restore_size=Total restore size is {1}MB")(total_restore_size / 1048576));
DataManager::SetProgress(0.0);
start_pos = 0;
@@ -927,17 +928,17 @@
if (!Restore_Partition(restore_part, Restore_Name, partition_count, &total_restore_size, &already_restored_size))
return false;
} else {
- LOGERR("Unable to locate '%s' partition for restoring.\n", restore_path.c_str());
+ gui_msg(Msg(msg::kError, "restore_unable_locate=Unable to locate '{1}' partition for restoring.")(restore_path));
}
start_pos = end_pos + 1;
end_pos = Restore_List.find(";", start_pos);
}
}
- TWFunc::GUI_Operation_Text(TW_UPDATE_SYSTEM_DETAILS_TEXT, "Updating System Details");
+ TWFunc::GUI_Operation_Text(TW_UPDATE_SYSTEM_DETAILS_TEXT, gui_parse_text("{@updating_system_details}"));
Update_System_Details();
UnMount_Main_Partitions();
time(&rStop);
- gui_print_color("highlight", "[RESTORE COMPLETED IN %d SECONDS]\n\n",(int)difftime(rStop,rStart));
+ gui_msg(Msg(msg::kHighlight, "restore_complete=[RESTORE COMPLETED IN {1} SECONDS]")((int)difftime(rStop,rStart)));
DataManager::SetValue("tw_file_progress", "");
return true;
}
@@ -953,7 +954,7 @@
d = opendir(Restore_Name.c_str());
if (d == NULL)
{
- LOGERR("Error opening %s\n", Restore_Name.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Restore_Name)(strerror(errno)));
return;
}
@@ -1020,7 +1021,7 @@
TWPartition* Part = Find_Partition_By_Path(label);
if (Part == NULL)
{
- LOGERR(" Unable to locate partition by backup name: '%s'\n", label);
+ gui_msg(Msg(msg::kError, "unable_locate_part_backup_name=Unable to locate partition by backup name: '{1}'")(label));
continue;
}
@@ -1060,7 +1061,7 @@
if (found) {
return ret;
} else
- LOGERR("Wipe: Unable to find partition for path '%s'\n", Local_Path.c_str());
+ gui_msg(Msg(msg::kError, "unable_find_part_path=Unable to find partition for path '{1}'")(Local_Path));
return false;
}
@@ -1085,7 +1086,7 @@
if (found) {
return ret;
} else
- LOGERR("Wipe: Unable to find partition for path '%s'\n", Local_Path.c_str());
+ gui_msg(Msg(msg::kError, "unable_find_part_path=Unable to find partition for path '{1}'")(Local_Path));
return false;
}
@@ -1127,11 +1128,11 @@
dir.push_back("/data/dalvik-cache");
dir.push_back("/cache/dalvik-cache");
dir.push_back("/cache/dc");
- gui_print("\nWiping Dalvik Cache Directories...\n");
+ gui_msg("wiping_dalvik=Wiping Dalvik Cache Directories...");
for (unsigned i = 0; i < dir.size(); ++i) {
if (stat(dir.at(i).c_str(), &st) == 0) {
TWFunc::removeDir(dir.at(i), false);
- gui_print("Cleaned: %s...\n", dir.at(i).c_str());
+ gui_msg(Msg("cleaned=Cleaned: {1}...")(dir.at(i)));
}
}
TWPartition* sdext = Find_Partition_By_Path("/sd-ext");
@@ -1140,10 +1141,10 @@
if (stat("/sd-ext/dalvik-cache", &st) == 0)
{
TWFunc::removeDir("/sd-ext/dalvik-cache", false);
- gui_print("Cleaned: /sd-ext/dalvik-cache...\n");
+ gui_msg(Msg("cleaned=Cleaned: {1}...")("/sd-ext/dalvik-cache"));
}
}
- gui_print("-- Dalvik Cache Directories Wipe Complete!\n\n");
+ gui_msg("dalvik_done=-- Dalvik Cache Directories Wipe Complete!");
return true;
}
@@ -1187,7 +1188,7 @@
if (found) {
return ret;
} else {
- LOGERR("No android secure partitions found.\n");
+ gui_err("no_andsec=No android secure partitions found.");
}
return false;
}
@@ -1201,7 +1202,7 @@
return dat->Wipe_Encryption();
} else {
- LOGERR("Unable to locate /data.\n");
+ gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1].")("/data"));
return false;
}
return false;
@@ -1218,14 +1219,14 @@
if (!dat->Mount(true))
return false;
- gui_print("Wiping internal storage -- /data/media...\n");
+ gui_msg("wiping_datamedia=Wiping internal storage -- /data/media...");
Remove_MTP_Storage(dat->MTP_Storage_ID);
TWFunc::removeDir("/data/media", false);
dat->Recreate_Media_Folder();
Add_MTP_Storage(dat->MTP_Storage_ID);
return true;
} else {
- LOGERR("Unable to locate /data.\n");
+ gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1].")("/data"));
return false;
}
return false;
@@ -1252,7 +1253,7 @@
if (found) {
return ret;
} else if (Display_Error) {
- LOGERR("Repair: Unable to find partition for path '%s'\n", Local_Path.c_str());
+ gui_msg(Msg(msg::kError, "unable_find_part_path=Unable to find partition for path '{1}'")(Local_Path));
} else {
LOGINFO("Repair: Unable to find partition for path '%s'\n", Local_Path.c_str());
}
@@ -1280,7 +1281,7 @@
if (found) {
return ret;
} else if (Display_Error) {
- LOGERR("Resize: Unable to find partition for path '%s'\n", Local_Path.c_str());
+ gui_msg(Msg(msg::kError, "unable_find_part_path=Unable to find partition for path '{1}'")(Local_Path));
} else {
LOGINFO("Resize: Unable to find partition for path '%s'\n", Local_Path.c_str());
}
@@ -1291,7 +1292,7 @@
std::vector<TWPartition*>::iterator iter;
int data_size = 0;
- gui_print("Updating partition details...\n");
+ gui_msg("update_part_details=Updating partition details...");
for (iter = Partitions.begin(); iter != Partitions.end(); iter++) {
if ((*iter)->Can_Be_Mounted) {
(*iter)->Update_Size(true);
@@ -1387,7 +1388,7 @@
#endif
}
}
- gui_print("...done\n");
+ gui_msg("update_part_details_done=...done");
DataManager::SetValue(TW_BACKUP_DATA_SIZE, data_size);
string current_storage_path = DataManager::GetCurrentStoragePath();
TWPartition* FreeStorage = Find_Partition_By_Path(current_storage_path);
@@ -1402,7 +1403,7 @@
if (current_storage_path == DataManager::GetSettingsStoragePath()) {
if (!FreeStorage->Is_Encrypted) {
// Not able to use internal, so error!
- LOGERR("Unable to mount internal storage.\n");
+ gui_msg(Msg(msg::kError, "unable_to_mount_internal=Unable to mount internal_storage"));
}
DataManager::SetValue(TW_STORAGE_FREE_SIZE, 0);
} else {
@@ -1413,13 +1414,13 @@
if (FreeStorage != NULL) {
DataManager::SetValue(TW_STORAGE_FREE_SIZE, (int)(FreeStorage->Free / 1048576LLU));
} else {
- LOGERR("Unable to locate internal storage partition.\n");
+ gui_msg(Msg(msg::kError, "unable_to_locate=Unable to locate {1}")("internal storage partition"));
DataManager::SetValue(TW_STORAGE_FREE_SIZE, 0);
}
}
} else {
// No dual storage and unable to mount storage, error!
- LOGERR("Unable to mount storage.\n");
+ gui_msg(Msg(msg::kError, "unable_to_mount_storage=Unable to mount storage"));
DataManager::SetValue(TW_STORAGE_FREE_SIZE, 0);
}
} else {
@@ -1465,7 +1466,7 @@
}
if (pwret != 0) {
- LOGERR("Failed to decrypt data.\n");
+ gui_err("fail_decrypt=Failed to decrypt data.");
return -1;
}
@@ -1481,7 +1482,7 @@
dat->Decrypted_Block_Device = crypto_blkdev;
dat->Setup_File_System(false);
dat->Current_File_System = dat->Fstab_File_System; // Needed if we're ignoring blkid because encrypted devices start out as emmc
- gui_print("Data successfully decrypted, new block device: '%s'\n", crypto_blkdev);
+ gui_msg(Msg("decrypt_success=Data successfully decrypted, new block device: '{1}'")(crypto_blkdev));
// Sleep for a bit so that the device will be ready
sleep(1);
@@ -1500,7 +1501,7 @@
}
return 0;
#else
- LOGERR("No crypto support was compiled into this build.\n");
+ gui_err("no_crypto_support=No crypto support was compiled into this build.");
return -1;
#endif
return 1;
@@ -1523,7 +1524,7 @@
result = perms.fixContexts();
#endif
UnMount_Main_Partitions();
- gui_print("Done.\n\n");
+ gui_msg("done=Done.");
return result;
}
@@ -1553,7 +1554,8 @@
TWPartition* Part = Find_Partition_By_Path(Partition_Path);
if (Part == NULL) {
- LOGERR("Unable to locate '%s' for USB storage mode.", Partition_Path.c_str());
+ LOGINFO("Unable to locate '%s' for USB storage mode.", Partition_Path.c_str());
+ gui_msg(Msg(msg::kError, "unable_find_part_path=Unable to find partition for path '{1}'")(Partition_Path));
return false;
}
LOGINFO("USB mount '%s', '%s' > '%s'\n", Partition_Path.c_str(), Part->Actual_Block_Device.c_str(), Lun_File.c_str());
@@ -1591,7 +1593,7 @@
goto error_handle;
}
} else {
- LOGERR("Unable to find storage partition to mount to USB\n");
+ gui_err("unable_locate_storage=Unable to locate storage device.");
goto error_handle;
}
} else if (!Open_Lun_File(DataManager::GetCurrentStoragePath(), lun_file)) {
@@ -1613,7 +1615,7 @@
Open_Lun_File(Mount2->Mount_Point, lun_file);
}
} else {
- LOGERR("Unable to find storage partition to mount to USB\n");
+ gui_err("unable_locate_storage=Unable to locate storage device.");
goto error_handle;
}
}
@@ -1686,14 +1688,14 @@
int ext, swap, total_size = 0, fat_size;
FILE* fp;
- gui_print("Partitioning SD Card...\n");
+ gui_msg("start_partition_sd=Partitioning SD Card...");
#ifdef TW_EXTERNAL_STORAGE_PATH
TWPartition* SDCard = Find_Partition_By_Path(EXPAND(TW_EXTERNAL_STORAGE_PATH));
#else
TWPartition* SDCard = Find_Partition_By_Path("/sdcard");
#endif
if (SDCard == NULL || !SDCard->Removable || SDCard->Has_Data_Media) {
- LOGERR("Unable to locate device to partition.\n");
+ gui_err("partition_sd_locate=Unable to locate device to partition.");
return false;
}
if (!SDCard->UnMount(true))
@@ -1712,7 +1714,7 @@
// Find the size of the block device:
fp = fopen("/proc/partitions", "rt");
if (fp == NULL) {
- LOGERR("Unable to open /proc/partitions\n");
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")("/proc/partitions")(strerror(errno)));
return false;
}
@@ -1750,40 +1752,40 @@
sprintf(temp, "%i", fat_size + ext + swap);
swap_str = temp;
if (ext + swap > total_size) {
- LOGERR("EXT + Swap size is larger than sdcard size.\n");
+ gui_err("ext_swap_size=EXT + Swap size is larger than sdcard size.");
return false;
}
- gui_print("Removing partition table...\n");
+ gui_msg("remove_part_table=Removing partition table...");
Command = "parted -s " + Device + " mklabel msdos";
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
- LOGERR("Unable to remove partition table.\n");
+ gui_err("unable_rm_part=Unable to remove partition table.");
Update_System_Details();
return false;
}
- gui_print("Creating FAT32 partition...\n");
+ gui_msg(Msg("create_part=Creating {1} partition...")("FAT32"));
Command = "parted " + Device + " mkpartfs primary fat32 0 " + fat_str + "MB";
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
- LOGERR("Unable to create FAT32 partition.\n");
+ gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("FAT32"));
return false;
}
if (ext > 0) {
- gui_print("Creating EXT partition...\n");
+ gui_msg(Msg("create_part=Creating {1} partition...")("EXT"));
Command = "parted " + Device + " mkpartfs primary ext2 " + fat_str + "MB " + ext_str + "MB";
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
- LOGERR("Unable to create EXT partition.\n");
+ gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("EXT"));
Update_System_Details();
return false;
}
}
if (swap > 0) {
- gui_print("Creating swap partition...\n");
+ gui_msg(Msg("create_part=Creating {1} partition...")("swap"));
Command = "parted " + Device + " mkpartfs primary linux-swap " + ext_str + "MB " + swap_str + "MB";
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
- LOGERR("Unable to create swap partition.\n");
+ gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("swap"));
Update_System_Details();
return false;
}
@@ -1815,13 +1817,13 @@
return false;
}
Command = "mke2fs -t " + ext_format + " -m 0 " + SDext->Actual_Block_Device;
- gui_print("Formatting sd-ext as %s...\n", ext_format.c_str());
+ gui_msg(Msg("format_sdext_as=Formatting sd-ext as {1}...")(ext_format));
LOGINFO("Formatting sd-ext after partitioning, command: '%s'\n", Command.c_str());
TWFunc::Exec_Cmd(Command);
}
Update_System_Details();
- gui_print("Partitioning complete.\n");
+ gui_msg("part_complete=Partitioning complete.");
return true;
}
@@ -1900,7 +1902,7 @@
Partition_List->push_back(part);
}
} else {
- LOGERR("Unable to locate '%s' partition for restore.\n", restore_path.c_str());
+ gui_msg(Msg(msg::kError, "restore_unable_locate=Unable to locate '{1}' partition for restoring.")(restore_path));
}
start_pos = end_pos + 1;
end_pos = Restore_List.find(";", start_pos);
@@ -1908,7 +1910,7 @@
}
} else if (ListType == "wipe") {
struct PartitionList dalvik;
- dalvik.Display_Name = "Dalvik Cache";
+ dalvik.Display_Name = gui_parse_text("{@dalvik}");
dalvik.Mount_Point = "DALVIK";
dalvik.selected = 0;
Partition_List->push_back(dalvik);
@@ -1961,7 +1963,7 @@
FILE *fp = fopen("/cache/recovery/storage.fstab", "w");
if (fp == NULL) {
- LOGERR("Unable to open '/cache/recovery/storage.fstab'.\n");
+ gui_msg(Msg(msg::kError, "unable_to_open=Unable to open '{1}'.")("/cache/recovery/storage.fstab"));
return;
}
@@ -1995,7 +1997,7 @@
bool TWPartitionManager::Enable_MTP(void) {
#ifdef TW_HAS_MTP
if (mtppid) {
- LOGERR("MTP already enabled\n");
+ gui_err("mtp_already_enabled=MTP already enabled");
return true;
}
//Launch MTP Responder
@@ -2036,11 +2038,11 @@
} else {
close(mtppipe[0]);
close(mtppipe[1]);
- LOGERR("Failed to enable MTP\n");
+ gui_err("mtp_fail=Failed to enable MTP");
return false;
}
#else
- LOGERR("MTP support not included\n");
+ gui_err("no_mtp=MTP support not included");
#endif
DataManager::SetValue("tw_mtp_enabled", 0);
return false;
@@ -2157,7 +2159,7 @@
}
return true;
#else
- LOGERR("MTP support not included\n");
+ gui_err("no_mtp=MTP support not included");
DataManager::SetValue("tw_mtp_enabled", 0);
return false;
#endif
@@ -2217,13 +2219,13 @@
string Flash_List, flash_path;
size_t start_pos = 0, end_pos = 0;
- gui_print("\n[IMAGE FLASH STARTED]\n\n");
- gui_print("Image to flash: '%s'\n", Filename.c_str());
+ gui_msg("image_flash_start=[IMAGE FLASH STARTED]");
+ gui_msg(Msg("img_to_flash=Image to flash: '{1}'")(Filename));
if (!Mount_Current_Storage(true))
return false;
- gui_print("Calculating restore details...\n");
+ gui_msg("calc_restore=Calculating restore details...");
DataManager::GetValue("tw_flash_partition", Flash_List);
if (!Flash_List.empty()) {
end_pos = Flash_List.find(";", start_pos);
@@ -2233,11 +2235,11 @@
if (flash_part != NULL) {
partition_count++;
if (partition_count > 1) {
- LOGERR("Too many partitions selected for flashing.\n");
+ gui_err("too_many_flash=Too many partitions selected for flashing.");
return false;
}
} else {
- LOGERR("Unable to locate '%s' partition for flashing (flash list).\n", flash_path.c_str());
+ gui_msg(Msg(msg::kError, "flash_unable_locate=Unable to locate '{1}' partition for flashing.")(flash_path));
return false;
}
start_pos = end_pos + 1;
@@ -2246,7 +2248,7 @@
}
if (partition_count == 0) {
- LOGERR("No partitions selected for flashing.\n");
+ gui_err("no_part_flash=No partitions selected for flashing.");
return false;
}
@@ -2255,9 +2257,56 @@
if (!flash_part->Flash_Image(Filename))
return false;
} else {
- LOGERR("Invalid flash partition specified.\n");
+ gui_err("invalid_flash=Invalid flash partition specified.");
return false;
}
- gui_print_color("highlight", "[IMAGE FLASH COMPLETED]\n\n");
+ gui_highlight("flash_done=IMAGE FLASH COMPLETED]");
return true;
}
+
+void TWPartitionManager::Translate_Partition(const char* path, const char* resource_name, const char* default_value) {
+ TWPartition* part = PartitionManager.Find_Partition_By_Path(path);
+ if (part) {
+ part->Display_Name = gui_lookup(resource_name, default_value);
+ part->Backup_Display_Name = part->Display_Name;
+ }
+}
+
+void TWPartitionManager::Translate_Partition(const char* path, const char* resource_name, const char* default_value, const char* storage_resource_name, const char* storage_default_value) {
+ TWPartition* part = PartitionManager.Find_Partition_By_Path(path);
+ if (part) {
+ part->Display_Name = gui_lookup(resource_name, default_value);
+ part->Backup_Display_Name = part->Display_Name;
+ if (part->Is_Storage)
+ part->Storage_Name = gui_lookup(storage_resource_name, storage_default_value);
+ }
+}
+
+void TWPartitionManager::Translate_Partition_Display_Names() {
+ Translate_Partition("/system", "system", "System");
+ Translate_Partition("/system_image", "system_image", "System Image");
+ Translate_Partition("/vendor", "vendor", "Vendor");
+ Translate_Partition("/vendor_image", "vendor_image", "Vendor Image");
+ Translate_Partition("/cache", "cache", "Cache");
+ Translate_Partition("/data", "data", "Data", "internal", "Internal Storage");
+ Translate_Partition("/boot", "boot", "Boot");
+ Translate_Partition("/recovery", "recovery", "Recovery");
+ if (!datamedia) {
+ Translate_Partition("/sdcard", "sdcard", "SDCard", "sdcard", "SDCard");
+ Translate_Partition("/internal_sd", "sdcard", "SDCard", "sdcard", "SDCard");
+ Translate_Partition("/internal_sdcard", "sdcard", "SDCard", "sdcard", "SDCard");
+ Translate_Partition("/emmc", "sdcard", "SDCard", "sdcard", "SDCard");
+ }
+ Translate_Partition("/external_sd", "microsd", "Micro SDCard", "microsd", "Micro SDCard");
+ Translate_Partition("/external_sdcard", "microsd", "Micro SDCard", "microsd", "Micro SDCard");
+ Translate_Partition("/usb-otg", "usbotg", "USB OTG", "usbotg", "USB OTG");
+ Translate_Partition("/sd-ext", "sdext", "SD-EXT");
+
+ // Android secure is a special case
+ TWPartition* part = PartitionManager.Find_Partition_By_Path("/and-sec");
+ if (part)
+ part->Backup_Display_Name = gui_lookup("android_secure", "Android Secure");
+
+ // This updates the text on all of the storage selection buttons in the GUI
+ DataManager::SetBackupFolder();
+}
diff --git a/partitions.hpp b/partitions.hpp
index f9832ad..ed26870 100644
--- a/partitions.hpp
+++ b/partitions.hpp
@@ -178,6 +178,7 @@
friend class DataManager;
friend class GUIPartitionList;
friend class GUIAction;
+friend class PageManager;
};
class TWPartitionManager
@@ -233,6 +234,9 @@
bool Remove_MTP_Storage(string Mount_Point); // Adds or removes an MTP Storage partition
bool Remove_MTP_Storage(unsigned int Storage_ID); // Adds or removes an MTP Storage partition
bool Flash_Image(string Filename); // Flashes an image to a selected partition from the partition list
+ void Translate_Partition(const char* path, const char* resource_name, const char* default_value);
+ void Translate_Partition(const char* path, const char* resource_name, const char* default_value, const char* storage_resource_name, const char* storage_default_value);
+ void Translate_Partition_Display_Names(); // Updates display names based on translations
TWAtomicInt stop_backup;
diff --git a/twinstall.cpp b/twinstall.cpp
index 7eea07d..a2eb725 100644
--- a/twinstall.cpp
+++ b/twinstall.cpp
@@ -40,6 +40,7 @@
#include "partitions.hpp"
#include "twrpDigest.hpp"
#include "twrp-functions.hpp"
+#include "gui/gui.hpp"
extern "C" {
#include "gui/gui.h"
#include "legacy_property_service.h"
@@ -102,7 +103,7 @@
if (binary_location == NULL) {
mzCloseZipArchive(Zip);
- LOGERR("Could not find '" ASSUMED_UPDATE_BINARY_NAME "' in the zip file.\n");
+ gui_msg(Msg(msg::kError, "no_updater_binary=Could not find '{1}' in the zip file.")(ASSUMED_UPDATE_BINARY_NAME));
return INSTALL_CORRUPT;
}
@@ -257,9 +258,9 @@
return INSTALL_CORRUPT;
}
- gui_print("Installing '%s'...\n", path);
+ gui_msg(Msg("installing_zip=Installing zip file '{1}'")(path));
if (strlen(path) < 9 || strncmp(path, "/sideload", 9) != 0) {
- gui_print("Checking for MD5 file...\n");
+ gui_msg("check_for_md5=Checking for MD5 file...");
twrpDigest md5sum;
md5sum.setfn(path);
int md5_return = md5sum.verify_md5digest();
@@ -276,24 +277,25 @@
MemMapping map;
if (sysMapFile(path, &map) != 0) {
- LOGERR("Failed to sysMapFile '%s'\n", path);
+ gui_msg(Msg(msg::kError, "fail_sysmap=Failed to map file '{1}'")(path));
return -1;
}
if (zip_verify) {
- gui_print("Verifying zip signature...\n");
+ gui_msg("verify_zip_sig=Verifying zip signature...");
ret_val = verify_file(map.addr, map.length);
if (ret_val != VERIFY_SUCCESS) {
- LOGERR("Zip signature verification failed: %i\n", ret_val);
+ LOGINFO("Zip signature verification failed: %i\n", ret_val);
+ gui_err("verify_zip_fail=Zip signature verification failed!");
sysReleaseMap(&map);
return -1;
} else {
- gui_print("Zip signature verified successfully.\n");
+ gui_msg("verify_zip_done=Zip signature verified successfully.");
}
}
ret_val = mzOpenZipArchive(map.addr, map.length, &Zip);
if (ret_val != 0) {
- LOGERR("Zip file is corrupt!\n", path);
+ gui_err("zip_corrupt=Zip file is corrupt!");
sysReleaseMap(&map);
return INSTALL_CORRUPT;
}
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 644d565..a7a8e8d 100644
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -45,6 +45,7 @@
#include "bootloader.h"
#include "cutils/properties.h"
#include "cutils/android_reboot.h"
+#include "gui/gui.hpp"
#include <sys/reboot.h>
#endif // ndef BUILD_TWRPTAR_MAIN
#ifndef TW_EXCLUDE_ENCRYPTED_BACKUPS
@@ -122,12 +123,12 @@
rc_pid = waitpid(pid, status, 0);
if (rc_pid > 0) {
if (WIFSIGNALED(*status)) {
- LOGERR("%s process ended with signal: %d\n", Child_Name.c_str(), WTERMSIG(*status)); // Seg fault or some other non-graceful termination
+ gui_msg(Msg(msg::kError, "pid_signal={1} process ended with signal: {2}")(Child_Name)(WTERMSIG(*status))); // Seg fault or some other non-graceful termination
return -1;
} else if (WEXITSTATUS(*status) == 0) {
LOGINFO("%s process ended with RC=%d\n", Child_Name.c_str(), WEXITSTATUS(*status)); // Success
} else {
- LOGERR("%s process ended with ERROR=%d\n", Child_Name.c_str(), WEXITSTATUS(*status)); // Graceful exit, but there was an error
+ gui_msg(Msg(msg::kError, "pid_error={1} process ended with ERROR: {2}")(Child_Name)(WEXITSTATUS(*status))); // Graceful exit, but there was an error
return -1;
}
} else { // no PID returned
@@ -207,13 +208,13 @@
f = fopen(fn.c_str(), "rb");
if (f == NULL) {
- LOGERR("Failed to open '%s' to try decrypt\n", fn.c_str());
+ LOGERR("Failed to open '%s' to try decrypt: %s\n", fn.c_str(), strerror(errno));
oaes_free(&ctx);
return -1;
}
read_len = fread(buffer, sizeof(uint8_t), 4096, f);
if (read_len <= 0) {
- LOGERR("Read size during try decrypt failed\n");
+ LOGERR("Read size during try decrypt failed: %s\n", strerror(errno));
fclose(f);
oaes_free(&ctx);
return -1;
@@ -355,50 +356,50 @@
if (!PartitionManager.Mount_By_Path("/data", true))
return;
- gui_print("Installing HTC Dumlock to system...\n");
+ gui_msg("install_dumlock=Installing HTC Dumlock to system...");
copy_file(TWHTCD_PATH "htcdumlocksys", "/system/bin/htcdumlock", 0755);
if (!Path_Exists("/system/bin/flash_image")) {
- gui_print("Installing flash_image...\n");
+ LOGINFO("Installing flash_image...\n");
copy_file(TWHTCD_PATH "flash_imagesys", "/system/bin/flash_image", 0755);
need_libs = 1;
} else
- gui_print("flash_image is already installed, skipping...\n");
+ LOGINFO("flash_image is already installed, skipping...\n");
if (!Path_Exists("/system/bin/dump_image")) {
- gui_print("Installing dump_image...\n");
+ LOGINFO("Installing dump_image...\n");
copy_file(TWHTCD_PATH "dump_imagesys", "/system/bin/dump_image", 0755);
need_libs = 1;
} else
- gui_print("dump_image is already installed, skipping...\n");
+ LOGINFO("dump_image is already installed, skipping...\n");
if (need_libs) {
- gui_print("Installing libs needed for flash_image and dump_image...\n");
+ LOGINFO("Installing libs needed for flash_image and dump_image...\n");
copy_file(TWHTCD_PATH "libbmlutils.so", "/system/lib/libbmlutils.so", 0644);
copy_file(TWHTCD_PATH "libflashutils.so", "/system/lib/libflashutils.so", 0644);
copy_file(TWHTCD_PATH "libmmcutils.so", "/system/lib/libmmcutils.so", 0644);
copy_file(TWHTCD_PATH "libmtdutils.so", "/system/lib/libmtdutils.so", 0644);
}
- gui_print("Installing HTC Dumlock app...\n");
+ LOGINFO("Installing HTC Dumlock app...\n");
mkdir("/data/app", 0777);
unlink("/data/app/com.teamwin.htcdumlock*");
copy_file(TWHTCD_PATH "HTCDumlock.apk", "/data/app/com.teamwin.htcdumlock.apk", 0777);
sync();
- gui_print("HTC Dumlock is installed.\n");
+ gui_msg("done=Done.");
}
void TWFunc::htc_dumlock_restore_original_boot(void) {
if (!PartitionManager.Mount_By_Path("/sdcard", true))
return;
- gui_print("Restoring original boot...\n");
+ gui_msg("dumlock_restore=Restoring original boot...");
Exec_Cmd("htcdumlock restore");
- gui_print("Original boot restored.\n");
+ gui_msg("done=Done.");
}
void TWFunc::htc_dumlock_reflash_recovery_to_boot(void) {
if (!PartitionManager.Mount_By_Path("/sdcard", true))
return;
- gui_print("Reflashing recovery to boot...\n");
+ gui_msg("dumlock_reflash=Reflashing recovery to boot...");
Exec_Cmd("htcdumlock recovery noreboot");
- gui_print("Recovery is flashed to boot.\n");
+ gui_msg("done=Done.");
}
int TWFunc::Recursive_Mkdir(string Path) {
@@ -411,7 +412,7 @@
wholePath = pathCpy.substr(0, pos);
if (!TWFunc::Path_Exists(wholePath)) {
if (mkdir(wholePath.c_str(), 0777)) {
- LOGERR("Unable to create folder: %s (errno=%d)\n", wholePath.c_str(), errno);
+ gui_msg(Msg(msg::kError, "create_folder_strerr=Can not create '{1}' folder ({2})")(wholePath)(strerror(errno)));
return false;
} else {
tw_set_default_metadata(wholePath.c_str());
@@ -570,10 +571,10 @@
// Check for and run startup script if script exists
struct stat st;
if (stat(script_file, &st) == 0) {
- gui_print("Running %s script...\n", display_name);
+ gui_msg(Msg("run_script=Running {1} script...")(display_name));
chmod(script_file, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
TWFunc::Exec_Cmd(script_file);
- gui_print("\nFinished running %s script.\n", display_name);
+ gui_msg("done=Done.");
}
}
@@ -583,7 +584,7 @@
string new_path;
if (d == NULL) {
- LOGERR("Error opening dir: '%s'\n", path.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(path)(strerror(errno)));
return -1;
}
@@ -742,7 +743,7 @@
Restore_Path += "/";
d = opendir(Restore_Path.c_str());
if (d == NULL) {
- LOGERR("Error opening '%s'\n", Restore_Path.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Restore_Path)(strerror(errno)));
return false;
}
@@ -1042,7 +1043,7 @@
// Disable flashing of stock recovery
if (TWFunc::Path_Exists("/system/recovery-from-boot.p")) {
rename("/system/recovery-from-boot.p", "/system/recovery-from-boot.bak");
- gui_print("Renamed stock recovery file in /system to prevent\nthe stock ROM from replacing TWRP.\n");
+ gui_msg("rename_stock=Renamed stock recovery file in /system to prevent the stock ROM from replacing TWRP.");
sync();
}
PartitionManager.UnMount_By_Path("/system", false);
diff --git a/twrp.cpp b/twrp.cpp
index d49ae80..b33a6ad 100644
--- a/twrp.cpp
+++ b/twrp.cpp
@@ -15,12 +15,13 @@
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
+#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
+#include "gui/twmsg.h"
#include "cutils/properties.h"
extern "C" {
@@ -37,6 +38,9 @@
#include "gui/gui.h"
#include "set_metadata.h"
}
+#include "gui/gui.hpp"
+#include "gui/pages.hpp"
+#include "gui/objects.hpp"
#include "twcommon.h"
#include "twrp-functions.hpp"
#include "data.hpp"
@@ -162,14 +166,14 @@
lgetfilecon("/sbin/teamwin", &contexts);
}
if (!contexts) {
- gui_print_color("warning", "Kernel does not have support for reading SELinux contexts.\n");
+ gui_warn("no_kernel_selinux=Kernel does not have support for reading SELinux contexts.");
} else {
free(contexts);
- gui_print("Full SELinux support is present.\n");
+ gui_msg("full_selinux=Full SELinux support is present.");
}
}
#else
- gui_print_color("warning", "No SELinux support (no libselinux).\n");
+ gui_warn("no_selinux=No SELinux support (no libselinux).");
#endif
PartitionManager.Mount_By_Path("/cache", true);
@@ -307,6 +311,8 @@
DataManager::SetValue("tw_mtp_enabled", 1);
#endif
DataManager::ReadSettingsFile();
+ PageManager::LoadLanguage(DataManager::GetStrValue("tw_language"));
+ GUIConsole::Translate_Now();
// Fixup the RTC clock on devices which require it
if(crash_counter == 0)
@@ -328,13 +334,13 @@
if (!PartitionManager.Enable_MTP())
PartitionManager.Disable_MTP();
else
- gui_print("MTP Enabled\n");
+ gui_msg("mtp_enabled=MTP Enabled");
} else {
PartitionManager.Disable_MTP();
}
property_set("mtp.crash_check", "0");
} else {
- gui_print_color("warning", "MTP Crashed, not starting MTP on boot.\n");
+ gui_warn("mtp_crash=MTP Crashed, not starting MTP on boot.");
DataManager::SetValue("tw_mtp_enabled", 0);
PartitionManager.Disable_MTP();
}
@@ -367,7 +373,6 @@
}
}
#endif
-
// Launch the main GUI
gui_start();
@@ -391,7 +396,7 @@
// Reboot
TWFunc::Update_Intent_File(Reboot_Value);
TWFunc::Update_Log_File();
- gui_print("Rebooting...\n");
+ gui_msg(Msg("rebooting=Rebooting..."));
string Reboot_Arg;
DataManager::GetValue("tw_reboot_arg", Reboot_Arg);
if (Reboot_Arg == "recovery")
diff --git a/twrpDU.cpp b/twrpDU.cpp
index 271dea8..08dfdcb 100644
--- a/twrpDU.cpp
+++ b/twrpDU.cpp
@@ -30,6 +30,7 @@
#include <algorithm>
#include "twrpDU.hpp"
#include "twrp-functions.hpp"
+#include "gui/gui.hpp"
using namespace std;
@@ -73,8 +74,7 @@
d = opendir(Path.c_str());
if (d == NULL) {
- LOGERR("error opening '%s'\n", Path.c_str());
- LOGERR("error: %s\n", strerror(errno));
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Path)(strerror(errno)));
return 0;
}
@@ -82,7 +82,8 @@
FullPath = Path + "/";
FullPath += de->d_name;
if (lstat(FullPath.c_str(), &st)) {
- LOGERR("Unable to stat '%s'\n", FullPath.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(FullPath)(strerror(errno)));
+ LOGINFO("Real error: Unable to stat '%s'\n", FullPath.c_str());
continue;
}
if ((st.st_mode & S_IFDIR) && !check_skip_dirs(FullPath) && de->d_type != DT_SOCK) {
diff --git a/twrpDigest.cpp b/twrpDigest.cpp
index 8380d2c..fe0e067 100644
--- a/twrpDigest.cpp
+++ b/twrpDigest.cpp
@@ -19,7 +19,6 @@
extern "C"
{
#include "digest/md5.h"
- #include "gui/gui.h"
#include "libcrecovery/common.h"
}
@@ -41,6 +40,7 @@
#include "twrp-functions.hpp"
#include "twrpDigest.hpp"
#include "set_metadata.h"
+#include "gui/gui.hpp"
using namespace std;
@@ -103,10 +103,10 @@
}
if (!foundMd5File) {
- gui_print("Skipping MD5 check: no MD5 file found\n");
+ gui_msg("no_md5=Skipping MD5 check: no MD5 file found");
return -1;
} else if (TWFunc::read_file(md5file, line) != 0) {
- gui_print("Skipping MD5 check: MD5 file unreadable\n");
+ LOGERR("Skipping MD5 check: MD5 file unreadable %s\n", strerror(errno));
return 1;
}
@@ -139,10 +139,10 @@
md5string += hex;
}
if (tokens.at(0) != md5string) {
- LOGERR("MD5 does not match\n");
+ gui_err("md5_fail=MD5 does not match");
return -2;
}
- gui_print("MD5 matched\n");
+ gui_msg("md5_match=MD5 matched");
return 0;
}
diff --git a/twrpTar.cpp b/twrpTar.cpp
index b6e4410..968f3aa 100644
--- a/twrpTar.cpp
+++ b/twrpTar.cpp
@@ -45,6 +45,7 @@
#ifndef BUILD_TWRPTAR_MAIN
#include "data.hpp"
#include "infomanager.hpp"
+#include "gui/gui.hpp"
extern "C" {
#include "set_metadata.h"
}
@@ -97,11 +98,13 @@
file_count = 0;
if (pipe(progress_pipe) < 0) {
- LOGERR("Error creating progress tracking pipe\n");
+ LOGINFO("Error creating progress tracking pipe\n");
+ gui_err("backup_error=Error creating backup.");
return -1;
}
if ((tar_fork_pid = fork()) == -1) {
LOGINFO("create tar failed to fork.\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[0]);
close(progress_pipe[1]);
return -1;
@@ -139,7 +142,7 @@
d = opendir(tardir.c_str());
if (d == NULL) {
- LOGERR("error opening '%s'\n", tardir.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tardir)(strerror(errno)));
close(progress_pipe[1]);
_exit(-1);
}
@@ -154,7 +157,8 @@
if (userdata_encryption && ((item_len >= 3 && strncmp(de->d_name, "app", 3) == 0) || (item_len >= 6 && strncmp(de->d_name, "dalvik", 6) == 0))) {
ret = Generate_TarList(FileName, &RegularList, &target_size, ®ular_thread_id);
if (ret < 0) {
- LOGERR("Error in Generate_TarList with regular list!\n");
+ LOGINFO("Error in Generate_TarList with regular list!\n");
+ gui_err("backup_error=Error creating backup.");
closedir(d);
close(progress_pipe_fd);
close(progress_pipe[1]);
@@ -186,7 +190,7 @@
d = opendir(tardir.c_str());
if (d == NULL) {
- LOGERR("error opening '%s'\n", tardir.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tardir)(strerror(errno)));
close(progress_pipe[1]);
_exit(-1);
}
@@ -204,7 +208,8 @@
FileName = tardir + "/" + de->d_name;
ret = Generate_TarList(FileName, &EncryptList, &target_size, &enc_thread_id);
if (ret < 0) {
- LOGERR("Error in Generate_TarList with encrypted list!\n");
+ LOGINFO("Error in Generate_TarList with encrypted list!\n");
+ gui_err("backup_error=Error creating backup.");
closedir(d);
close(progress_pipe[1]);
_exit(-1);
@@ -223,12 +228,13 @@
}
closedir(d);
if (enc_thread_id != core_count) {
- LOGERR("Error dividing up threads for encryption, %u threads for %u cores!\n", enc_thread_id, core_count);
+ LOGINFO("Error dividing up threads for encryption, %u threads for %u cores!\n", enc_thread_id, core_count);
if (enc_thread_id > core_count) {
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
} else {
- LOGERR("Continuining anyway.");
+ LOGINFO("Continuining anyway.");
}
}
@@ -249,24 +255,28 @@
reg.progress_pipe_fd = progress_pipe_fd;
LOGINFO("Creating unencrypted backup...\n");
if (createList((void*)®) != 0) {
- LOGERR("Error creating unencrypted backup.\n");
+ LOGINFO("Error creating unencrypted backup.\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
}
if (pthread_attr_init(&tattr)) {
- LOGERR("Unable to pthread_attr_init\n");
+ LOGINFO("Unable to pthread_attr_init\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE)) {
- LOGERR("Error setting pthread_attr_setdetachstate\n");
+ LOGINFO("Error setting pthread_attr_setdetachstate\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
if (pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM)) {
- LOGERR("Error setting pthread_attr_setscope\n");
+ LOGINFO("Error setting pthread_attr_setscope\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
@@ -291,7 +301,8 @@
if (ret) {
LOGINFO("Unable to create %i thread for encryption! %i\nContinuing in same thread (backup will be slower).\n", i, ret);
if (createList((void*)&enc[i]) != 0) {
- LOGERR("Error creating encrypted backup %i.\n", i);
+ LOGINFO("Error creating encrypted backup %i.\n", i);
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
} else {
@@ -301,12 +312,13 @@
usleep(100000); // Need a short delay before starting the next thread or the threads will never finish for some reason.
}
if (pthread_attr_destroy(&tattr)) {
- LOGERR("Failed to pthread_attr_destroy\n");
+ LOGINFO("Failed to pthread_attr_destroy\n");
}
for (i = start_thread_id; i <= core_count; i++) {
if (enc[i].thread_id == i) {
if (pthread_join(enc_thread[i], &thread_return)) {
- LOGERR("Error joining thread %i\n", i);
+ LOGINFO("Error joining thread %i\n", i);
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
} else {
@@ -314,7 +326,8 @@
ret = (int)(intptr_t)thread_return;
if (ret != 0) {
thread_error = 1;
- LOGERR("Thread %i returned an error %i.\n", i, ret);
+ LOGINFO("Thread %i returned an error %i.\n", i, ret);
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
@@ -324,7 +337,8 @@
}
}
if (thread_error) {
- LOGERR("Error returned by one or more threads.\n");
+ LOGINFO("Error returned by one or more threads.\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
@@ -342,7 +356,8 @@
// Generate list of files to back up
ret = Generate_TarList(tardir, &FileList, &target_size, &thread_id);
if (ret < 0) {
- LOGERR("Error in Generate_TarList!\n");
+ LOGINFO("Error in Generate_TarList!\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
@@ -356,7 +371,7 @@
reg.setsize(Total_Backup_Size);
reg.progress_pipe_fd = progress_pipe_fd;
if (Total_Backup_Size > MAX_ARCHIVE_SIZE) {
- gui_print("Breaking backup file into multiple archives...\n");
+ gui_msg("split_backup=Breaking backup file into multiple archives...");
reg.split_archives = 1;
} else {
reg.split_archives = 0;
@@ -365,7 +380,7 @@
write(progress_pipe_fd, &file_count, sizeof(file_count));
write(progress_pipe_fd, &Total_Backup_Size, sizeof(Total_Backup_Size));
if (createList((void*)®) != 0) {
- LOGERR("Error creating backup.\n");
+ gui_err("backup_error=Error creating backup.");
close(progress_pipe[1]);
_exit(-1);
}
@@ -381,6 +396,8 @@
char size_progress[1024];
files_backup = 0;
size_backup = 0;
+ string file_prog = gui_lookup("file_progress", "%llu of %llu files, %i%%");
+ string size_prog = gui_lookup("size_progress", "%lluMB of %lluMB, %i%%");
fork_pid = tar_fork_pid;
@@ -402,11 +419,11 @@
files_backup++;
size_backup += fs;
display_percent = (double)(files_backup) / (double)(file_count) * 100;
- sprintf(file_progress, "%llu of %llu files, %i%%", files_backup, file_count, (int)(display_percent));
+ sprintf(file_progress, file_prog.c_str(), files_backup, file_count, (int)(display_percent));
#ifndef BUILD_TWRPTAR_MAIN
DataManager::SetValue("tw_file_progress", file_progress);
display_percent = (double)(size_backup + *other_backups_size) / (double)(*overall_size) * 100;
- sprintf(size_progress, "%lluMB of %lluMB, %i%%", (size_backup + *other_backups_size) / 1048576, *overall_size / 1048576, (int)(display_percent));
+ sprintf(size_progress, size_prog.c_str(), (size_backup + *other_backups_size) / 1048576, *overall_size / 1048576, (int)(display_percent));
DataManager::SetValue("tw_size_progress", size_progress);
progress_percent = (display_percent / 100);
DataManager::SetProgress((float)(progress_percent));
@@ -443,7 +460,8 @@
int progress_pipe[2], ret;
if (pipe(progress_pipe) < 0) {
- LOGERR("Error creating progress tracking pipe\n");
+ LOGINFO("Error creating progress tracking pipe\n");
+ gui_err("restore_error=Error during restore process.");
return -1;
}
@@ -475,7 +493,8 @@
temp = basefn + "%i%02i";
tarfn += "000";
if (!TWFunc::Path_Exists(tarfn)) {
- LOGERR("Unable to locate '%s' or '%s'\n", basefn.c_str(), tarfn.c_str());
+ LOGINFO("Unable to locate '%s' or '%s'\n", basefn.c_str(), tarfn.c_str());
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
}
@@ -485,7 +504,8 @@
tars[0].thread_id = 0;
tars[0].progress_pipe_fd = progress_pipe_fd;
if (extractMulti((void*)&tars[0]) != 0) {
- LOGERR("Error extracting split archive.\n");
+ LOGINFO("Error extracting split archive.\n");
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
}
@@ -494,17 +514,20 @@
}
// Start threading encrypted restores
if (pthread_attr_init(&tattr)) {
- LOGERR("Unable to pthread_attr_init\n");
+ LOGINFO("Unable to pthread_attr_init\n");
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
}
if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE)) {
- LOGERR("Error setting pthread_attr_setdetachstate\n");
+ LOGINFO("Error setting pthread_attr_setdetachstate\n");
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
}
if (pthread_attr_setscope(&tattr, PTHREAD_SCOPE_SYSTEM)) {
- LOGERR("Error setting pthread_attr_setscope\n");
+ LOGINFO("Error setting pthread_attr_setscope\n");
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
}
@@ -526,7 +549,8 @@
if (ret) {
LOGINFO("Unable to create %i thread for extraction! %i\nContinuing in same thread (restore will be slower).\n", i, ret);
if (extractMulti((void*)&tars[i]) != 0) {
- LOGERR("Error extracting backup in thread %i.\n", i);
+ LOGINFO("Error extracting backup in thread %i.\n", i);
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
} else {
@@ -541,7 +565,8 @@
for (i = start_thread_id; i < thread_count + start_thread_id; i++) {
if (tars[i].thread_id == i) {
if (pthread_join(tar_thread[i], &thread_return)) {
- LOGERR("Error joining thread %i\n", i);
+ LOGINFO("Error joining thread %i\n", i);
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
} else {
@@ -549,7 +574,8 @@
ret = (int)(intptr_t)thread_return;
if (ret != 0) {
thread_error = 1;
- LOGERR("Thread %i returned an error %i.\n", i, ret);
+ LOGINFO("Thread %i returned an error %i.\n", i, ret);
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
}
@@ -559,7 +585,8 @@
}
}
if (thread_error) {
- LOGERR("Error returned by one or more threads.\n");
+ LOGINFO("Error returned by one or more threads.\n");
+ gui_err("restore_error=Error during restore process.");
close(progress_pipe_fd);
_exit(-1);
}
@@ -574,6 +601,7 @@
double display_percent, progress_percent;
char size_progress[1024];
size_backup = 0;
+ string size_prog = gui_lookup("size_progress", "%lluMB of %lluMB, %i%%");
// Parent closes output side
close(progress_pipe[1]);
@@ -582,7 +610,7 @@
while (read(progress_pipe[0], &fs, sizeof(fs)) > 0) {
size_backup += fs;
display_percent = (double)(size_backup + *other_backups_size) / (double)(*overall_size) * 100;
- sprintf(size_progress, "%lluMB of %lluMB, %i%%", (size_backup + *other_backups_size) / 1048576, *overall_size / 1048576, (int)(display_percent));
+ sprintf(size_progress, size_prog.c_str(), (size_backup + *other_backups_size) / 1048576, *overall_size / 1048576, (int)(display_percent));
progress_percent = (display_percent / 100);
#ifndef BUILD_TWRPTAR_MAIN
DataManager::SetValue("tw_size_progress", size_progress);
@@ -621,7 +649,7 @@
d = opendir(Path.c_str());
if (d == NULL) {
- LOGERR("Error opening '%s' -- error: %s\n", Path.c_str(), strerror(errno));
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Path)(strerror(errno)));
closedir(d);
return -1;
}
@@ -660,11 +688,13 @@
if (openTar() == -1)
return -1;
if (tar_extract_all(t, charRootDir, &progress_pipe_fd) != 0) {
- LOGERR("Unable to extract tar archive '%s'\n", tarfn.c_str());
+ LOGINFO("Unable to extract tar archive '%s'\n", tarfn.c_str());
+ gui_err("restore_error=Error during restore process.");
return -1;
}
if (tar_close(t) != 0) {
- LOGERR("Unable to close tar file\n");
+ LOGINFO("Unable to close tar file\n");
+ gui_err("restore_error=Error during restore process.");
return -1;
}
return 0;
@@ -681,11 +711,12 @@
} else if (Archive_Current_Type == 2) {
int ret = TWFunc::Try_Decrypting_File(tarfn, password);
if (ret < 1) {
- LOGERR("Failed to decrypt tar file '%s'\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "fail_decrypt_tar=Failed to decrypt tar file '{1}'")(tarfn));
return -1;
}
if (ret == 1) {
- LOGERR("Decrypted file is not in tar format.\n");
+ LOGINFO("Decrypted file is not in tar format.\n");
+ gui_err("restore_error=Error during restore process.");
return -1;
}
if (ret == 3) {
@@ -720,7 +751,8 @@
}
LOGINFO("Creating tar file '%s'\n", tarfn.c_str());
if (createTar() != 0) {
- LOGERR("Error creating tar '%s' for thread %i\n", tarfn.c_str(), thread_id);
+ LOGINFO("Error creating tar '%s' for thread %i\n", tarfn.c_str(), thread_id);
+ gui_err("backup_error=Error creating backup.");
return -2;
}
Archive_Current_Size = 0;
@@ -733,19 +765,22 @@
fs = (unsigned long long)(st.st_size);
if (split_archives && Archive_Current_Size + fs > MAX_ARCHIVE_SIZE) {
if (closeTar() != 0) {
- LOGERR("Error closing '%s' on thread %i\n", tarfn.c_str(), thread_id);
+ LOGINFO("Error closing '%s' on thread %i\n", tarfn.c_str(), thread_id);
+ gui_err("backup_error=Error creating backup.");
return -3;
}
archive_count++;
- gui_print("Splitting thread ID %i into archive %i\n", thread_id, archive_count + 1);
+ gui_msg(Msg("split_thread=Splitting thread ID {1} into archive {2}")(thread_id)(archive_count + 1));
if (archive_count > 99) {
- LOGERR("Too many archives for thread %i\n", thread_id);
+ LOGINFO("Too many archives for thread %i\n", thread_id);
+ gui_err("backup_error=Error creating backup.");
return -4;
}
sprintf(actual_filename, temp.c_str(), thread_id, archive_count);
tarfn = actual_filename;
if (createTar() != 0) {
- LOGERR("Error creating tar '%s' for thread %i\n", tarfn.c_str(), thread_id);
+ LOGINFO("Error creating tar '%s' for thread %i\n", tarfn.c_str(), thread_id);
+ gui_err("backup_error=Error creating backup.");
return -2;
}
Archive_Current_Size = 0;
@@ -755,14 +790,16 @@
}
LOGINFO("addFile '%s' including root: %i\n", buf, include_root_dir);
if (addFile(buf, include_root_dir) != 0) {
- LOGERR("Error adding file '%s' to '%s'\n", buf, tarfn.c_str());
+ LOGINFO("Error adding file '%s' to '%s'\n", buf, tarfn.c_str());
+ gui_err("backup_error=Error creating backup.");
return -1;
}
}
i++;
}
if (closeTar() != 0) {
- LOGERR("Error closing '%s' on thread %i\n", tarfn.c_str(), thread_id);
+ LOGINFO("Error closing '%s' on thread %i\n", tarfn.c_str(), thread_id);
+ gui_err("backup_error=Error creating backup.");
return -3;
}
LOGINFO("Thread id %i tarList done, %i archives.\n", thread_id, archive_count);
@@ -834,16 +871,18 @@
int i, pipes[4];
if (pipe(pipes) < 0) {
- LOGERR("Error creating first pipe\n");
+ LOGINFO("Error creating first pipe\n");
+ gui_err("backup_error=Error creating backup.");
return -1;
}
if (pipe(pipes + 2) < 0) {
- LOGERR("Error creating second pipe\n");
+ LOGINFO("Error creating second pipe\n");
+ gui_err("backup_error=Error creating backup.");
return -1;
}
int output_fd = open(tarfn.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (output_fd < 0) {
- LOGERR("Failed to open '%s'\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tarfn)(strerror(errno)));
for (i = 0; i < 4; i++)
close(pipes[i]); // close all
return -1;
@@ -851,7 +890,8 @@
pigz_pid = fork();
if (pigz_pid < 0) {
- LOGERR("pigz fork() failed\n");
+ LOGINFO("pigz fork() failed\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
for (i = 0; i < 4; i++)
close(pipes[i]); // close all
@@ -865,7 +905,8 @@
close(1);
dup2(pipes[3], 1);
if (execlp("pigz", "pigz", "-", NULL) < 0) {
- LOGERR("execlp pigz ERROR!\n");
+ LOGINFO("execlp pigz ERROR!\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
close(pipes[0]);
close(pipes[3]);
@@ -876,7 +917,8 @@
oaes_pid = fork();
if (oaes_pid < 0) {
- LOGERR("openaes fork() failed\n");
+ LOGINFO("openaes fork() failed\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
for (i = 0; i < 4; i++)
close(pipes[i]); // close all
@@ -891,7 +933,8 @@
close(1);
dup2(output_fd, 1);
if (execlp("openaes", "openaes", "enc", "--key", password.c_str(), NULL) < 0) {
- LOGERR("execlp openaes ERROR!\n");
+ LOGINFO("execlp openaes ERROR!\n");
+ gui_err("backup_error=Error creating backup.");
close(pipes[2]);
close(output_fd);
_exit(-1);
@@ -904,7 +947,8 @@
fd = pipes[1];
if(tar_fdopen(&t, fd, charRootDir, NULL, O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) != 0) {
close(fd);
- LOGERR("tar_fdopen failed\n");
+ LOGINFO("tar_fdopen failed\n");
+ gui_err("backup_error=Error creating backup.");
return -1;
}
return 0;
@@ -917,20 +961,22 @@
int pigzfd[2];
int output_fd = open(tarfn.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (output_fd < 0) {
- LOGERR("Failed to open '%s'\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tarfn)(strerror(errno)));
close(pigzfd[0]);
return -1;
}
if (pipe(pigzfd) < 0) {
- LOGERR("Error creating pipe\n");
+ LOGINFO("Error creating pipe\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
return -1;
}
pigz_pid = fork();
if (pigz_pid < 0) {
- LOGERR("fork() failed\n");
+ LOGINFO("fork() failed\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
close(pigzfd[0]);
close(pigzfd[1]);
@@ -941,7 +987,8 @@
dup2(pigzfd[0], 0); // remap stdin
dup2(output_fd, 1); // remap stdout to output file
if (execlp("pigz", "pigz", "-", NULL) < 0) {
- LOGERR("execlp pigz ERROR!\n");
+ LOGINFO("execlp pigz ERROR!\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
close(pigzfd[0]);
_exit(-1);
@@ -952,7 +999,8 @@
fd = pigzfd[1]; // copy parent output
if(tar_fdopen(&t, fd, charRootDir, NULL, O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) != 0) {
close(fd);
- LOGERR("tar_fdopen failed\n");
+ LOGINFO("tar_fdopen failed\n");
+ gui_err("backup_error=Error creating backup.");
return -1;
}
}
@@ -963,18 +1011,20 @@
int oaesfd[2];
int output_fd = open(tarfn.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (output_fd < 0) {
- LOGERR("Failed to open '%s'\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tarfn)(strerror(errno)));
return -1;
}
if (pipe(oaesfd) < 0) {
- LOGERR("Error creating pipe\n");
+ LOGINFO("Error creating pipe\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
return -1;
}
oaes_pid = fork();
if (oaes_pid < 0) {
- LOGERR("fork() failed\n");
+ LOGINFO("fork() failed\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
close(oaesfd[0]);
close(oaesfd[1]);
@@ -985,7 +1035,8 @@
dup2(oaesfd[0], 0); // remap stdin
dup2(output_fd, 1); // remap stdout to output file
if (execlp("openaes", "openaes", "enc", "--key", password.c_str(), NULL) < 0) {
- LOGERR("execlp openaes ERROR!\n");
+ LOGINFO("execlp openaes ERROR!\n");
+ gui_err("backup_error=Error creating backup.");
close(output_fd);
close(oaesfd[0]);
_exit(-1);
@@ -996,7 +1047,8 @@
fd = oaesfd[1]; // copy parent output
if(tar_fdopen(&t, fd, charRootDir, NULL, O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) != 0) {
close(fd);
- LOGERR("tar_fdopen failed\n");
+ LOGINFO("tar_fdopen failed\n");
+ gui_err("backup_error=Error creating backup.");
return -1;
}
return 0;
@@ -1005,7 +1057,8 @@
// Not compressed or encrypted
init_libtar_buffer(0);
if (tar_open(&t, charTarFile, &type, O_WRONLY | O_CREAT | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) == -1) {
- LOGERR("tar_open error opening '%s'\n", tarfn.c_str());
+ LOGINFO("tar_open error opening '%s'\n", tarfn.c_str());
+ gui_err("backup_error=Error creating backup.");
return -1;
}
}
@@ -1022,17 +1075,19 @@
int i, pipes[4];
int input_fd = open(tarfn.c_str(), O_RDONLY | O_LARGEFILE);
if (input_fd < 0) {
- LOGERR("Failed to open '%s'\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tarfn)(strerror(errno)));
return -1;
}
if (pipe(pipes) < 0) {
- LOGERR("Error creating first pipe\n");
+ LOGINFO("Error creating first pipe\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
return -1;
}
if (pipe(pipes + 2) < 0) {
- LOGERR("Error creating second pipe\n");
+ LOGINFO("Error creating second pipe\n");
+ gui_err("restore_error=Error during restore process.");
close(pipes[0]);
close(pipes[1]);
close(input_fd);
@@ -1041,7 +1096,8 @@
oaes_pid = fork();
if (oaes_pid < 0) {
- LOGERR("pigz fork() failed\n");
+ LOGINFO("pigz fork() failed\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
for (i = 0; i < 4; i++)
close(pipes[i]); // close all
@@ -1056,7 +1112,8 @@
close(1);
dup2(pipes[1], 1);
if (execlp("openaes", "openaes", "dec", "--key", password.c_str(), NULL) < 0) {
- LOGERR("execlp openaes ERROR!\n");
+ LOGINFO("execlp openaes ERROR!\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
close(pipes[1]);
_exit(-1);
@@ -1066,7 +1123,8 @@
pigz_pid = fork();
if (pigz_pid < 0) {
- LOGERR("openaes fork() failed\n");
+ LOGINFO("openaes fork() failed\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
for (i = 0; i < 4; i++)
close(pipes[i]); // close all
@@ -1080,7 +1138,8 @@
close(1);
dup2(pipes[3], 1);
if (execlp("pigz", "pigz", "-d", "-c", NULL) < 0) {
- LOGERR("execlp pigz ERROR!\n");
+ LOGINFO("execlp pigz ERROR!\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
close(pipes[0]);
close(pipes[3]);
@@ -1094,7 +1153,8 @@
fd = pipes[2];
if(tar_fdopen(&t, fd, charRootDir, NULL, O_RDONLY | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) != 0) {
close(fd);
- LOGERR("tar_fdopen failed\n");
+ LOGINFO("tar_fdopen failed\n");
+ gui_err("restore_error=Error during restore process.");
return -1;
}
}
@@ -1104,19 +1164,21 @@
int oaesfd[2];
int input_fd = open(tarfn.c_str(), O_RDONLY | O_LARGEFILE);
if (input_fd < 0) {
- LOGERR("Failed to open '%s'\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tarfn)(strerror(errno)));
return -1;
}
if (pipe(oaesfd) < 0) {
- LOGERR("Error creating pipe\n");
+ LOGINFO("Error creating pipe\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
return -1;
}
oaes_pid = fork();
if (oaes_pid < 0) {
- LOGERR("fork() failed\n");
+ LOGINFO("fork() failed\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
close(oaesfd[0]);
close(oaesfd[1]);
@@ -1128,7 +1190,8 @@
dup2(oaesfd[1], 1); // remap stdout
dup2(input_fd, 0); // remap input fd to stdin
if (execlp("openaes", "openaes", "dec", "--key", password.c_str(), NULL) < 0) {
- LOGERR("execlp openaes ERROR!\n");
+ LOGINFO("execlp openaes ERROR!\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
close(oaesfd[1]);
_exit(-1);
@@ -1139,7 +1202,8 @@
fd = oaesfd[0]; // copy parent input
if(tar_fdopen(&t, fd, charRootDir, NULL, O_RDONLY | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) != 0) {
close(fd);
- LOGERR("tar_fdopen failed\n");
+ LOGINFO("tar_fdopen failed\n");
+ gui_err("restore_error=Error during restore process.");
return -1;
}
}
@@ -1148,18 +1212,20 @@
int pigzfd[2];
int input_fd = open(tarfn.c_str(), O_RDONLY | O_LARGEFILE);
if (input_fd < 0) {
- LOGERR("Failed to open '%s'\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(tarfn)(strerror(errno)));
return -1;
}
if (pipe(pigzfd) < 0) {
- LOGERR("Error creating pipe\n");
+ LOGINFO("Error creating pipe\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
return -1;
}
pigz_pid = fork();
if (pigz_pid < 0) {
- LOGERR("fork() failed\n");
+ LOGINFO("fork() failed\n");
+ gui_err("restore_error=Error during restore process.");
close(input_fd);
close(pigzfd[0]);
close(pigzfd[1]);
@@ -1172,7 +1238,8 @@
if (execlp("pigz", "pigz", "-d", "-c", NULL) < 0) {
close(pigzfd[1]);
close(input_fd);
- LOGERR("execlp openaes ERROR!\n");
+ LOGINFO("execlp openaes ERROR!\n");
+ gui_err("restore_error=Error during restore process.");
_exit(-1);
}
} else {
@@ -1181,12 +1248,14 @@
fd = pigzfd[0]; // copy parent input
if(tar_fdopen(&t, fd, charRootDir, NULL, O_RDONLY | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) != 0) {
close(fd);
- LOGERR("tar_fdopen failed\n");
+ LOGINFO("tar_fdopen failed\n");
+ gui_err("restore_error=Error during restore process.");
return -1;
}
}
} else if (tar_open(&t, charTarFile, NULL, O_RDONLY | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, TAR_GNU | TAR_STORE_SELINUX) != 0) {
- LOGERR("Unable to open tar archive '%s'\n", charTarFile);
+ LOGINFO("Unable to open tar archive '%s'\n", charTarFile);
+ gui_err("restore_error=Error during restore process.");
return -1;
}
return 0;
@@ -1229,12 +1298,12 @@
int twrpTar::closeTar() {
flush_libtar_buffer(t->fd);
if (tar_append_eof(t) != 0) {
- LOGERR("tar_append_eof(): %s\n", strerror(errno));
+ LOGINFO("tar_append_eof(): %s\n", strerror(errno));
tar_close(t);
return -1;
}
if (tar_close(t) != 0) {
- LOGERR("Unable to close tar archive: '%s'\n", tarfn.c_str());
+ LOGINFO("Unable to close tar archive: '%s'\n", tarfn.c_str());
return -1;
}
if (Archive_Current_Type > 0) {
@@ -1253,7 +1322,7 @@
}
}
if (TWFunc::Get_File_Size(tarfn) == 0) {
- LOGERR("Backup file size for '%s' is 0 bytes.\n", tarfn.c_str());
+ gui_msg(Msg(msg::kError, "backup_size=Backup file size for '%s' is 0 bytes.")(tarfn));
return -1;
}
#ifndef BUILD_TWRPTAR_MAIN
@@ -1373,7 +1442,7 @@
int ret = TWFunc::Try_Decrypting_File(filename, password);
*archive_type = 2;
if (ret < 1) {
- LOGERR("Failed to decrypt tar file '%s'\n", filename.c_str());
+ gui_msg(Msg(msg::kError, "fail_decrypt_tar=Failed to decrypt tar file '{1}'")(tarfn));
total_size = TWFunc::Get_File_Size(filename);
} else if (ret == 1) {
LOGERR("Decrypted file is not in tar format.\n");