Merge "Add an option to start a pVM without pvmfw" into main
diff --git a/android/TerminalApp/Android.bp b/android/TerminalApp/Android.bp
index bf93226..3b5f9b8 100644
--- a/android/TerminalApp/Android.bp
+++ b/android/TerminalApp/Android.bp
@@ -24,7 +24,10 @@
platform_apis: true,
privileged: true,
optimize: {
- enabled: false,
+ // TODO(b/377100096): enable bytecode optimization again
+ //optimize: true,
+ proguard_flags_files: ["proguard.flags"],
+ shrink_resources: true,
},
apex_available: [
"com.android.virt",
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java b/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java
index c8f5bab..a9102b0 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/InstallerActivity.java
@@ -33,6 +33,8 @@
import android.widget.TextView;
import android.widget.Toast;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.lang.ref.WeakReference;
import java.util.concurrent.ExecutorService;
@@ -98,6 +100,7 @@
super.onDestroy();
}
+ @VisibleForTesting
public boolean waitForInstallCompleted(long timeoutMillis) {
return mInstallCompleted.block(timeoutMillis);
}
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/InstallerService.java b/android/TerminalApp/java/com/android/virtualization/terminal/InstallerService.java
index 5967b6f..2ce0cdc 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/InstallerService.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/InstallerService.java
@@ -25,6 +25,7 @@
import android.content.pm.ServiceInfo;
import android.os.Build;
import android.os.IBinder;
+import android.os.SELinux;
import android.util.Log;
import androidx.annotation.Nullable;
@@ -37,6 +38,7 @@
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import java.io.BufferedInputStream;
+import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URL;
@@ -45,6 +47,7 @@
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
+import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -54,11 +57,13 @@
private static final String NOTIFICATION_CHANNEL_ID = "installer";
private static final int NOTIFICATION_ID = 1313; // any unique number among notifications
- // TODO(b/369740847): Replace this URL with dl.google.com
private static final String IMAGE_URL =
Arrays.asList(Build.SUPPORTED_ABIS).contains("x86_64")
- ? "https://github.com/ikicha/debian_ci/releases/download/release_x86_64/images.tar.gz"
- : "https://github.com/ikicha/debian_ci/releases/download/release_aarch64/images.tar.gz";
+ ? "https://dl.google.com/android/ferrochrome/latest/x86_64/images.tar.gz"
+ : "https://dl.google.com/android/ferrochrome/latest/aarch64/images.tar.gz";
+
+ private static final String SELINUX_FILE_CONTEXT =
+ "u:object_r:virtualizationservice_data_file:";
private final Object mLock = new Object();
@@ -144,7 +149,9 @@
() -> {
// TODO(b/374015561): Provide progress update
boolean success = downloadFromSdcard() || downloadFromUrl();
-
+ if (success) {
+ reLabelImagesSELinuxContext();
+ }
stopForeground(STOP_FOREGROUND_REMOVE);
synchronized (mLock) {
@@ -156,6 +163,24 @@
});
}
+ private void reLabelImagesSELinuxContext() {
+ File payloadFolder = InstallUtils.getInternalStorageDir(this);
+
+ // The context should be u:object_r:privapp_data_file:s0:c35,c257,c512,c768
+ // and we want to get s0:c35,c257,c512,c768 part
+ String level = SELinux.getFileContext(payloadFolder.toString()).split(":", 4)[3];
+ String targetContext = SELINUX_FILE_CONTEXT + level;
+
+ File[] files = payloadFolder.listFiles();
+ for (File file : files) {
+ if (file.isFile() &&
+ !Objects.equals(SELinux.getFileContext(file.toString()),
+ targetContext)) {
+ SELinux.setFileContext(file.toString(), targetContext);
+ }
+ }
+ }
+
private boolean downloadFromSdcard() {
// Installing from sdcard is preferred, but only supported only in debuggable build.
if (Build.isDebuggable()) {
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.java b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.java
index c006e7b..4e32de7 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.java
@@ -52,6 +52,7 @@
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.virtualization.vmlauncher.InstallUtils;
import com.android.virtualization.vmlauncher.VmLauncherService;
import com.android.virtualization.vmlauncher.VmLauncherServices;
@@ -88,6 +89,7 @@
private ConditionVariable mBootCompleted = new ConditionVariable();
private static final int POST_NOTIFICATIONS_PERMISSION_REQUEST_CODE = 101;
private ActivityResultLauncher<Intent> manageExternalStorageActivityResultLauncher;
+ private static int diskSizeStep;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -103,6 +105,8 @@
}
setContentView(R.layout.activity_headless);
+ diskSizeStep = getResources().getInteger(
+ R.integer.disk_size_round_up_step_size_in_mb) << 20;
MaterialToolbar toolbar = (MaterialToolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -292,9 +296,9 @@
}
}
- private static File getPartitionFile(Context context, String fileName)
+ public static File getPartitionFile(Context context, String fileName)
throws FileNotFoundException {
- File file = new File(context.getFilesDir(), fileName);
+ File file = new File(InstallUtils.getInternalStorageDir(context), fileName);
if (!file.exists()) {
Log.d(TAG, file.getAbsolutePath() + " - file not found");
throw new FileNotFoundException("File not found: " + fileName);
@@ -510,19 +514,19 @@
VmLauncherServices.startVmLauncherService(this, this, notification);
}
+ @VisibleForTesting
public boolean waitForBootCompleted(long timeoutMillis) {
return mBootCompleted.block(timeoutMillis);
}
- private long roundUpDiskSize(long diskSize) {
- // Round up every disk_size_round_up_step_size_in_mb MB
- int disk_size_step = getResources().getInteger(
- R.integer.disk_size_round_up_step_size_in_mb) * 1024 * 1024;
- return (long) Math.ceil(((double) diskSize) / disk_size_step) * disk_size_step;
+ private static long roundUpDiskSize(long diskSize) {
+ // Round up every diskSizeStep MB
+ return (long) Math.ceil(((double) diskSize) / diskSizeStep) * diskSizeStep;
}
- private long getMinFilesystemSize(File file) throws IOException, NumberFormatException {
+ public static long getMinFilesystemSize(File file) throws IOException, NumberFormatException {
try {
+ runE2fsck(file.getAbsolutePath());
String result = runCommand("/system/bin/resize2fs", "-P", file.getAbsolutePath());
// The return value is the number of 4k block
long minSize = Long.parseLong(
@@ -545,12 +549,10 @@
getString(R.string.preference_file_key), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
- long minDiskSize = getMinFilesystemSize(file);
- editor.putLong(getString(R.string.preference_min_disk_size_key), minDiskSize);
-
long currentDiskSize = getFilesystemSize(file);
+ // The default partition size is 6G
long newSizeInBytes = sharedPref.getLong(getString(R.string.preference_disk_size_key),
- roundUpDiskSize(currentDiskSize));
+ 6L << 30);
editor.putLong(getString(R.string.preference_disk_size_key), newSizeInBytes);
editor.apply();
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsActivity.kt
index dccfea3..03768e9 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsActivity.kt
@@ -20,12 +20,17 @@
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.appbar.MaterialToolbar
+
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.settings_activity)
+ val toolbar: MaterialToolbar = findViewById(R.id.settings_toolbar)
+ setSupportActionBar(toolbar)
+ supportActionBar?.title = resources.getString(R.string.action_settings)
val settingsItems = arrayOf(
SettingsItem(
resources.getString(R.string.settings_disk_resize_title),
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
index 54e8ab2..58be98d 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/SettingsDiskResizeActivity.kt
@@ -55,13 +55,10 @@
0
)
).toFloat();
+ val partition = MainActivity.getPartitionFile(this, "root_part")
val minDiskSizeMb =
- bytesToMb(
- sharedPref.getLong(
- getString(R.string.preference_min_disk_size_key),
- 0
- )
- ).toFloat();
+ bytesToMb(MainActivity.getMinFilesystemSize(partition)).toFloat()
+ .coerceAtMost(diskSizeMb)
val diskSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_assigned)
val diskMaxSizeText = findViewById<TextView>(R.id.settings_disk_resize_resize_gb_max)
diff --git a/android/TerminalApp/proguard.flags b/android/TerminalApp/proguard.flags
index b93240c..8433e82 100644
--- a/android/TerminalApp/proguard.flags
+++ b/android/TerminalApp/proguard.flags
@@ -30,4 +30,4 @@
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
-##---------------End: proguard configuration for Gson ----------
\ No newline at end of file
+##---------------End: proguard configuration for Gson ----------
diff --git a/android/TerminalApp/res/layout/settings_activity.xml b/android/TerminalApp/res/layout/settings_activity.xml
index 4fc6229..3ec2617 100644
--- a/android/TerminalApp/res/layout/settings_activity.xml
+++ b/android/TerminalApp/res/layout/settings_activity.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true">
+ <com.google.android.material.appbar.MaterialToolbar
+ android:id="@+id/settings_toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ app:layout_constraintTop_toTopOf="parent"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/settings_list_recycler_view"
android:layout_marginHorizontal="16dp"
diff --git a/android/TerminalApp/res/values-af/strings.xml b/android/TerminalApp/res/values-af/strings.xml
index 251fc6f..8900852 100644
--- a/android/TerminalApp/res/values-af/strings.xml
+++ b/android/TerminalApp/res/values-af/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminaal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Installeer Linux-terminaal"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"As jy Linux-terminaal wil begin, moet jy omtrent <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> se data oor die netwerk aflaai.\nWil jy voortgaan?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Laai af wanneer wi-fi beskikbaar is"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installeer"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installeer tans"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Netwerkfout. Gaan verbinding na en probeer weer."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Afdelingherwinningopsies"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Verander na aanvanklike weergawe"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Verwyder almal"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Terugstelling van VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Instellings"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminaal loop tans"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klik om die terminaal oop te maak."</string>
diff --git a/android/TerminalApp/res/values-am/strings.xml b/android/TerminalApp/res/values-am/strings.xml
index 5d43521..cb3ef1b 100644
--- a/android/TerminalApp/res/values-am/strings.xml
+++ b/android/TerminalApp/res/values-am/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"ተርሚናል"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux ተርሚናልን ይጫኑ"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ተርሚናልን ለማስጀመር በአውታረ መረብ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> የሚገመት ውሂብ ማውረድ ያስፈልግዎታል። \nይቀጥላሉ?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi ሲገኝ አውርድ"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ጫን"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"በመጫን ላይ"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"የአውታረ መረብ ስህተት። ግንኙነት ይፈትሹ እና እንደገና ይሞክሩ።"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"የክፍልፋይ መልሶ ማግኛ አማራጮች"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ወደ የመጀመሪያ ሥሪት ለውጥ"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"ሁሉንም አስወግድ"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM ዳግም ማስጀመር"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ቅንብሮች"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ተርሚናል በመሄድ ላይ ነው"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ተርሚናሉን ለመክፈት ጠቅ ያድርጉ።"</string>
diff --git a/android/TerminalApp/res/values-ar/strings.xml b/android/TerminalApp/res/values-ar/strings.xml
index 9da65a5..d8c00d1 100644
--- a/android/TerminalApp/res/values-ar/strings.xml
+++ b/android/TerminalApp/res/values-ar/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"تثبيت الوحدة الطرفية بنظام التشغيل Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"لتشغيل الوحدة الطرفية بنظام التشغيل Linux، عليك تنزيل <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> من البيانات تقريبًا عبر الشبكة.\nهل تريد المتابعة؟"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"التنزيل عند توفُّر شبكة Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"تثبيت"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"جارٍ التثبيت"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"حدث خطأ في الشبكة. يُرجى التحقُّق من الاتصال وإعادة المحاولة."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"خيارات استرداد القسم"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"التبديل إلى الإصدار الأولي"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"إزالة الكل"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"إعادة ضبط الجهاز الافتراضي"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"الإعدادات"</string>
<string name="service_notification_title" msgid="2918088850910713393">"الوحدة الطرفية قيد التشغيل"</string>
<string name="service_notification_content" msgid="8652887364784704911">"انقر لفتح الوحدة الطرفية."</string>
diff --git a/android/TerminalApp/res/values-as/strings.xml b/android/TerminalApp/res/values-as/strings.xml
index 72aacd4..e53c08c 100644
--- a/android/TerminalApp/res/values-as/strings.xml
+++ b/android/TerminalApp/res/values-as/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"টাৰ্মিনেল"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux টাৰ্মিনেল ইনষ্টল কৰক"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux টাৰ্মিনেল লঞ্চ কৰিবলৈ, আপুনি নেটৱৰ্কত প্ৰায় <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ডেটা ডাউনল’ড কৰিব লাগিব।\nআপুনি আগবাঢ়িবনে?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ৱাই-ফাই সেৱা উপলব্ধ হ’লে ডাউনল’ড কৰক"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ইনষ্টল কৰক"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ইনষ্টল কৰি থকা হৈছে"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"নেটৱৰ্কৰ আসোঁৱাহ। সংযোগ পৰীক্ষা কৰক আৰু পুনৰ চেষ্টা কৰক।"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"পাৰ্টিশ্বন পুনৰুদ্ধাৰৰ বিকল্প"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"প্ৰাৰম্ভিক সংস্কৰণলৈ সলনি কৰক"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"আটাইবোৰ আঁতৰাওক"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM ৰিছেট কৰা হৈছে"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ছেটিং"</string>
<string name="service_notification_title" msgid="2918088850910713393">"টাৰ্মিনেলটো চলি আছে"</string>
<string name="service_notification_content" msgid="8652887364784704911">"টাৰ্মিনেলটো খুলিবলৈ ক্লিক কৰক।"</string>
diff --git a/android/TerminalApp/res/values-az/strings.xml b/android/TerminalApp/res/values-az/strings.xml
index f739030..fd2d13f 100644
--- a/android/TerminalApp/res/values-az/strings.xml
+++ b/android/TerminalApp/res/values-az/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux terminalını quraşdırın"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux terminalını işə salmaq üçün şəbəkə vasitəsilə təxminən <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> həcmində data endirməlisiniz.\nDavam etmək istəyirsiniz?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi əlçatan olduqda endirin"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Quraşdırın"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Quraşdırılır"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Şəbəkə xətası. Bağlantını yoxlayıb yenidən cəhd edin."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Bölmə üzrə bərpa seçimləri"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"İlkin versiyaya dəyişin"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Hamısını silin"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM-i sıfırlayın"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Ayarlar"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal işləyir"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Terminalı açmaq üçün klikləyin."</string>
diff --git a/android/TerminalApp/res/values-b+sr+Latn/strings.xml b/android/TerminalApp/res/values-b+sr+Latn/strings.xml
index 9362830..1a45522 100644
--- a/android/TerminalApp/res/values-b+sr+Latn/strings.xml
+++ b/android/TerminalApp/res/values-b+sr+Latn/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instalirajte Linux terminal"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Da biste pokrenuli Linux terminal, treba da preuzmete oko <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> podataka preko mreže.\nŽelite da nastavite?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Preuzmi kada WiFi bude dostupan"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instaliraj"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalira se"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Greška na mreži. Proverite vezu i probajte ponovo."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opcije oporavka particija"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Promenite na početnu verziju"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Uklonite sve"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Virtuelna mašina je resetovana"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Resetujte virtuelnu mašinu"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Podaci će biti izbrisani."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Potvrdi"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Otkaži"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Podešavanja"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal je aktivan"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliknite da biste otvorili terminal."</string>
diff --git a/android/TerminalApp/res/values-be/strings.xml b/android/TerminalApp/res/values-be/strings.xml
index 10495cc..35cf0ea 100644
--- a/android/TerminalApp/res/values-be/strings.xml
+++ b/android/TerminalApp/res/values-be/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Тэрмінал"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Усталяванне тэрмінала Linux"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Каб запусціць тэрмінал Linux, трэба спампаваць каля <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> даных па сетцы.\nПрацягнуць?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Спампаваць, калі будзе даступная сетка Wi-Fi"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Усталяваць"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Ідзе ўсталяванне"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Памылка сеткі. Праверце падключэнне і паўтарыце спробу."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Ідзе ўсталяванне тэрмінала Linux"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Тэрмінал Linux будзе запушчаны пасля завяршэння"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Не ўдалося ўсталяваць з-за праблемы з сеткай"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Не ўдалося ўсталяваць. Паўтарыце спробу."</string>
<string name="action_settings" msgid="5729342767795123227">"Налады"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Ідзе падрыхтоўка тэрмінала"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Спыненне тэрмінала"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Варыянты аднаўлення раздзела"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Змяніць на зыходную версію"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Выдаліць усе"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Віртуальная машына скінута"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Налады"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Тэрмінал запушчаны"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Націсніце, каб адкрыць тэрмінал."</string>
diff --git a/android/TerminalApp/res/values-bg/strings.xml b/android/TerminalApp/res/values-bg/strings.xml
index 66fa41f..b8f180d 100644
--- a/android/TerminalApp/res/values-bg/strings.xml
+++ b/android/TerminalApp/res/values-bg/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Терминал"</string>
<string name="installer_title_text" msgid="500663060973466805">"Инсталиране на терминала на Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"За да стартирате терминала на Linux, трябва да изтеглите около <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> данни през мрежата.\nИскате ли да продължите?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Изтегляне, когато е налице Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Инсталиране"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Инсталира се"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Грешка в мрежата. Проверете връзката и опитайте отново."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Опции за възстановяване на дяловете"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Промяна към първоначалната версия"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Премахване на всички"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Нулиране на виртуалната машина"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Нулиране на виртуалната машина"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Данните ще бъдат изтрити."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Потвърждаване"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Отказ"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Настройки"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Терминалът работи"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Кликнете, за да отворите терминала."</string>
diff --git a/android/TerminalApp/res/values-bn/strings.xml b/android/TerminalApp/res/values-bn/strings.xml
index a765ec1..e653a64 100644
--- a/android/TerminalApp/res/values-bn/strings.xml
+++ b/android/TerminalApp/res/values-bn/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"টার্মিনাল"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux টার্মিনাল ইনস্টল করুন"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux টার্মিনাল চালু করার জন্য আপনাকে নেটওয়ার্কের মাধ্যমে মোটামুটিভাবে <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ডেটা ডাউনলোড করতে হবে।\nআপনি কি চালিয়ে যাবেন?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ওয়াই-ফাই পাওয়া গেলে ডাউনলোড করুন"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ইনস্টল করুন"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ইনস্টল করা হচ্ছে"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"নেটওয়ার্কের সমস্যা। কানেকশন চেক করে আবার চেষ্টা করুন।"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"পার্টিশন আগের অবস্থায় ফেরানোর বিকল্প"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"প্রাথমিক ভার্সনে পরিবর্তন করুন"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"সবকটি সরান"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM (ভার্চুয়াল মেশিন) রিসেট"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"সেটিংস"</string>
<string name="service_notification_title" msgid="2918088850910713393">"টার্মিনাল চলছে"</string>
<string name="service_notification_content" msgid="8652887364784704911">"টার্মিনাল খুলতে ক্লিক করুন।"</string>
diff --git a/android/TerminalApp/res/values-bs/strings.xml b/android/TerminalApp/res/values-bs/strings.xml
index 80cb945..c36d003 100644
--- a/android/TerminalApp/res/values-bs/strings.xml
+++ b/android/TerminalApp/res/values-bs/strings.xml
@@ -17,16 +17,15 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
- <string name="installer_title_text" msgid="500663060973466805">"Instaliranje Linux terminala"</string>
- <string name="installer_desc_text_format" msgid="2734224805682171826">"Da biste pokrenuli Linux terminal, trebate preuzeti otprilike <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> podataka putem mreže.\nŽelite li nastaviti?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Instalirajte Linux terminal"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Da pokrenete Linux terminal, trebate preuzeti otprilike <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> podataka putem mreže.\nŽelite li nastaviti?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Preuzmi kada je WiFi dostupan"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instaliraj"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instaliranje"</string>
- <string name="installer_install_network_error_message" msgid="2450409107529774410">"Mrežna pogreška. Provjerite vezu i pokušajte ponovo."</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Greška na mreži. Provjeriti vezu i pokušajte ponovo."</string>
<string name="installer_notif_title_text" msgid="471160690081159042">"Instaliranje Linux terminala"</string>
- <string name="installer_notif_desc_text" msgid="6746098106305899060">"Linux terminal pokrenut će se nakon završetka"</string>
- <string name="installer_error_network" msgid="3265100678310833813">"Instalacija nije uspjela zbog problema s mrežom"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Linux terminal će se pokrenuti nakon završetka"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Instaliranje nije uspjelo zbog problema s mrežom"</string>
<string name="installer_error_unknown" msgid="1991780204241177455">"Instaliranje nije uspjelo. Pokušajte ponovo."</string>
<string name="action_settings" msgid="5729342767795123227">"Postavke"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Priprema terminala"</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opcije za oporavak particije"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Promijeni u početnu verziju"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Uklonite sve"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Virtuelna mašina je poništena"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Ponovno postavljanje virtualnog stroja"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Podaci će se izbrisati."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Potvrdi"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Odustani"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Postavke"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal je pokrenut"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliknite da otvorite terminal."</string>
diff --git a/android/TerminalApp/res/values-ca/strings.xml b/android/TerminalApp/res/values-ca/strings.xml
index 52495fb..f8cd76f 100644
--- a/android/TerminalApp/res/values-ca/strings.xml
+++ b/android/TerminalApp/res/values-ca/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instal·la el terminal de Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Per iniciar el terminal de Linux, has de baixar aproximadament <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de dades des de la xarxa.\nVols continuar?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Baixa quan hi hagi una Wi‐Fi disponible"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instal·la"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instal·lant"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Error de la xarxa. Comprova la connexió i torna-ho a provar."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opcions de recuperació de la partició"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Canvia a la versió inicial"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Suprimeix-ho tot"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"S\'ha restablert la màquina virtual"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Configuració"</string>
<string name="service_notification_title" msgid="2918088850910713393">"El terminal s\'està executant"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Fes clic per obrir el terminal."</string>
diff --git a/android/TerminalApp/res/values-cs/strings.xml b/android/TerminalApp/res/values-cs/strings.xml
index 1e01d28..442f8b4 100644
--- a/android/TerminalApp/res/values-cs/strings.xml
+++ b/android/TerminalApp/res/values-cs/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminál"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instalovat terminál Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Ke spuštění terminálu Linux si musíte přes datovou síť stáhnout přibližně <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> dat.\nChcete pokračovat?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Stáhnout, když bude dostupná Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalovat"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalace"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Chyba sítě. Zkontrolujte připojení a zkuste to znovu."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Možnosti obnovení oddílu"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Změnit na původní verzi"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Odstranit vše"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Virtuální počítač resetován"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Resetování virtuálního počítače"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Data budou smazána."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Potvrdit"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Zrušit"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Nastavení"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminál běží"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliknutím otevřete terminál."</string>
diff --git a/android/TerminalApp/res/values-da/strings.xml b/android/TerminalApp/res/values-da/strings.xml
index e01775d..5a94183 100644
--- a/android/TerminalApp/res/values-da/strings.xml
+++ b/android/TerminalApp/res/values-da/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Installer Linux-terminalen"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Du skal downloade ca. <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> data via netværket for at åbne Linux-terminalen.\nVil du fortsætte?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Download, når du har forbindelse til et Wi-Fi-netværk"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installer"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installerer"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Netværksfejl. Tjek forbindelsen, og prøv igen."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Muligheder for gendannelse af partition"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Skift til oprindelig version"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Fjern alle"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Nulstilling af VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Indstillinger"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminalen kører"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klik for at åbne terminalen."</string>
diff --git a/android/TerminalApp/res/values-de/strings.xml b/android/TerminalApp/res/values-de/strings.xml
index d038ddf..9005fe7 100644
--- a/android/TerminalApp/res/values-de/strings.xml
+++ b/android/TerminalApp/res/values-de/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux-Terminal installieren"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Damit du das Linux-Terminal starten kannst, musst du ungefähr <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> an Daten über das Netzwerk herunterladen.\nMöchtest du fortfahren?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Herunterladen, wenn WLAN verfügbar ist"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installieren"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Wird installiert"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Netzwerkfehler. Prüfe die Verbindung und versuche es noch einmal."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Optionen für die Partitionswiederherstellung"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Zur ersten Version wechseln"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Alle entfernen"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM wurde zurückgesetzt"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Einstellungen"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal wird ausgeführt"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klicke hier, um das Terminal zu öffnen."</string>
diff --git a/android/TerminalApp/res/values-el/strings.xml b/android/TerminalApp/res/values-el/strings.xml
index 05ce9e9..9b45014 100644
--- a/android/TerminalApp/res/values-el/strings.xml
+++ b/android/TerminalApp/res/values-el/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Τερματικό"</string>
<string name="installer_title_text" msgid="500663060973466805">"Εγκατάσταση τερματικού Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Για την εκκίνηση του τερματικού Linux, πρέπει να κατεβάσετε περίπου <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> δεδομένων μέσω δικτύου.\nΘέλετε να συνεχίσετε;"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Λήψη όταν υπάρχει διαθέσιμο Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Εγκατάσταση"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Εγκατάσταση"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Σφάλμα δικτύου. Ελέγξτε τη σύνδεση και δοκιμάστε ξανά."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Επιλογές ανάκτησης διαμερισμάτων"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Αλλαγή σε αρχική έκδοση"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Κατάργηση όλων"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Επαναφορά VM"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Επαναφορά της εικονικής μηχανής"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Τα δεδομένα θα διαγραφούν."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Επιβεβαίωση"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Ακύρωση"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Ρυθμίσεις"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Το τερματικό εκτελείται"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Κάντε κλικ για να ανοίξετε το τερματικό."</string>
diff --git a/android/TerminalApp/res/values-en-rAU/strings.xml b/android/TerminalApp/res/values-en-rAU/strings.xml
index a4d76a5..78dca51 100644
--- a/android/TerminalApp/res/values-en-rAU/strings.xml
+++ b/android/TerminalApp/res/values-en-rAU/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Install Linux terminal"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"To launch a Linux terminal, you need to download roughly <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> of data over the network.\nWould you like to proceed?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Download when Wi-Fi is available"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Install"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installing"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Network error. Check connection and retry."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Partition recovery options"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Change to initial version"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Remove all"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM reset"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Settings"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal is running"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Click to open the terminal."</string>
diff --git a/android/TerminalApp/res/values-en-rCA/strings.xml b/android/TerminalApp/res/values-en-rCA/strings.xml
index 7f3805a..90d163e 100644
--- a/android/TerminalApp/res/values-en-rCA/strings.xml
+++ b/android/TerminalApp/res/values-en-rCA/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Install Linux terminal"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"To launch Linux terminal, you need to download roughly <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> of data over network.\nWould you proceed?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Download when Wi-Fi is available"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Install"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installing"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Network error. Check connection and retry."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Partition Recovery options"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Change to Initial version"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Remove all"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM reset"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Reset the virtual machine"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Data will be deleted."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Confirm"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Cancel"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Settings"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal is running"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Click to open the terminal."</string>
diff --git a/android/TerminalApp/res/values-en-rGB/strings.xml b/android/TerminalApp/res/values-en-rGB/strings.xml
index a4d76a5..78dca51 100644
--- a/android/TerminalApp/res/values-en-rGB/strings.xml
+++ b/android/TerminalApp/res/values-en-rGB/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Install Linux terminal"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"To launch a Linux terminal, you need to download roughly <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> of data over the network.\nWould you like to proceed?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Download when Wi-Fi is available"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Install"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installing"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Network error. Check connection and retry."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Partition recovery options"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Change to initial version"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Remove all"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM reset"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Settings"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal is running"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Click to open the terminal."</string>
diff --git a/android/TerminalApp/res/values-en-rIN/strings.xml b/android/TerminalApp/res/values-en-rIN/strings.xml
index a4d76a5..78dca51 100644
--- a/android/TerminalApp/res/values-en-rIN/strings.xml
+++ b/android/TerminalApp/res/values-en-rIN/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Install Linux terminal"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"To launch a Linux terminal, you need to download roughly <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> of data over the network.\nWould you like to proceed?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Download when Wi-Fi is available"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Install"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installing"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Network error. Check connection and retry."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Partition recovery options"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Change to initial version"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Remove all"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM reset"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Settings"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal is running"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Click to open the terminal."</string>
diff --git a/android/TerminalApp/res/values-es-rUS/strings.xml b/android/TerminalApp/res/values-es-rUS/strings.xml
index 2668ae1..5cb0402 100644
--- a/android/TerminalApp/res/values-es-rUS/strings.xml
+++ b/android/TerminalApp/res/values-es-rUS/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instala la terminal de Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Para iniciar la terminal de Linux, debes descargar aproximadamente <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de datos a través de la red.\n¿Quieres continuar?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Descargar cuando haya una red Wi-Fi disponible"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalar"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalando"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Error de red. Comprueba la conexión y vuelve a intentarlo."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opciones de recuperación de particiones"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Cambiar a la versión inicial"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Quitar todos"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Restablecimiento de la VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Configuración"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Se está ejecutando la terminal"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Haz clic para abrir la terminal."</string>
diff --git a/android/TerminalApp/res/values-es/strings.xml b/android/TerminalApp/res/values-es/strings.xml
index c1870e8..b3f5089 100644
--- a/android/TerminalApp/res/values-es/strings.xml
+++ b/android/TerminalApp/res/values-es/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instala el terminal de Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Para iniciar el terminal de Linux, debes descargar aproximadamente <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de datos a través de la red.\n¿Quieres continuar?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Descargar cuando haya una red Wi-Fi disponible"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalar"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalando"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Error de red. Comprueba la conexión y vuelve a intentarlo."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opciones de recuperación de particiones"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Cambiar a versión inicial"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Quitar todo"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM restablecida"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Ajustes"</string>
<string name="service_notification_title" msgid="2918088850910713393">"El terminal se está ejecutando"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Haz clic para abrir el terminal."</string>
diff --git a/android/TerminalApp/res/values-et/strings.xml b/android/TerminalApp/res/values-et/strings.xml
index 0191c9a..53fb9d1 100644
--- a/android/TerminalApp/res/values-et/strings.xml
+++ b/android/TerminalApp/res/values-et/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linuxi terminali installimine"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linuxi terminali käivitamiseks tuleb teil võrgu kaudu alla laadida umbes <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> andmeid.\nKas soovite jätkata?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Laadi alla, kui WiFi on saadaval"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installi"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installimine"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Võrgu viga. Kontrollige ühendust ja proovige uuesti."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Sektsiooni taastevalikud"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Muutke algsele versioonile"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Eemaldage kõik"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM lähtestatud"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Seaded"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal töötab"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klõpsake terminali avamiseks."</string>
diff --git a/android/TerminalApp/res/values-eu/strings.xml b/android/TerminalApp/res/values-eu/strings.xml
index 80729ee..d66587e 100644
--- a/android/TerminalApp/res/values-eu/strings.xml
+++ b/android/TerminalApp/res/values-eu/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Terminala"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Instalatu Linux-en terminala"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux-en terminala exekutatzeko, gutxi gorabehera <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> datu deskargatu behar dituzu sarearen bidez.\nAurrera egin nahi duzu?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Deskargatu wifi-sare bat erabilgarri dagoenean"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalatu"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalatzen"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Sareko errorea. Egiaztatu konektatuta zaudela eta saiatu berriro."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux-en terminala instalatzen"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Prozesua amaitu ondoren abiaraziko da Linux-en terminala"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Ezin izan da instalatu, sarean arazo bat dagoelako"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Ezin izan da instalatu. Saiatu berriro."</string>
<string name="action_settings" msgid="5729342767795123227">"Ezarpenak"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Terminala prestatzen"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Terminala geldiarazten"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Partizioa berreskuratzeko aukerak"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Aldatu hasierako bertsiora"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Kendu guztiak"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Berrabiarazi da makina birtuala"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Ezarpenak"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminala abian da"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Egin klik terminala irekitzeko."</string>
diff --git a/android/TerminalApp/res/values-fa/strings.xml b/android/TerminalApp/res/values-fa/strings.xml
index 48c6974..766d14a 100644
--- a/android/TerminalApp/res/values-fa/strings.xml
+++ b/android/TerminalApp/res/values-fa/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"پایانه"</string>
<string name="installer_title_text" msgid="500663060973466805">"نصب پایانه Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"برای راهاندازی پایانه Linux، باید تقریباً <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> داده ازطریق شبکه بارگیری کنید.\nادامه میدهید؟"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"هنگام دسترسی به Wi-Fi بارگیری شود"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"نصب"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"درحال نصب"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"خطای شبکه. اتصال را بررسی و سپس دوباره امتحان کنید."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"گزینههای بازیابی پارتیشن"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"تغییر به نسخه ابتدایی"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"برداشتن همه"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"بازنشانی ماشین مجازی"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"تنظیمات"</string>
<string name="service_notification_title" msgid="2918088850910713393">"پایانه درحال اجرا است"</string>
<string name="service_notification_content" msgid="8652887364784704911">"برای باز کردن پایانه کلیک کنید."</string>
diff --git a/android/TerminalApp/res/values-fi/strings.xml b/android/TerminalApp/res/values-fi/strings.xml
index 3e10cbf..5560448 100644
--- a/android/TerminalApp/res/values-fi/strings.xml
+++ b/android/TerminalApp/res/values-fi/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Asenna Linux-pääte"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux-päätteen käynnistäminen edellyttää, että lataat noin <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> dataa verkon kautta.\nHaluatko jatkaa?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Lataa, kun Wi-Fi on käytettävissä"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Asenna"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Asennetaan"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Verkkovirhe. Tarkista yhteys ja yritä uudelleen."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Osion palautusvaihtoehdot"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Vaihda ensimmäiseen versioon"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Poista kaikki"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM nollattu"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Asetukset"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Pääte on käynnissä"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Avaa pääte klikkaamalla."</string>
diff --git a/android/TerminalApp/res/values-fr-rCA/strings.xml b/android/TerminalApp/res/values-fr-rCA/strings.xml
index 78a741c..8c22b70 100644
--- a/android/TerminalApp/res/values-fr-rCA/strings.xml
+++ b/android/TerminalApp/res/values-fr-rCA/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Installer le terminal Linux"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Pour lancer un terminal Linux, vous devez télécharger environ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de données sur le réseau.\nSouhaitez-vous continuer?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Télécharger lorsque le Wi-Fi est accessible"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installer"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installation…"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Erreur de réseau. Vérifiez la connexion et réessayez."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Installation du terminal Linux en cours…"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Le terminal Linux démarrera une fois l\'installation terminée"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Échec de l\'installation en raison d\'un problème de réseau"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Échec de l\'installation. Réessayez."</string>
<string name="action_settings" msgid="5729342767795123227">"Paramètres"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Préparation du terminal en cours…"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Arrêt du terminal en cours…"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Options de récupération de partition"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Passer à la version initiale"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Tout retirer"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Réinitialisation de la MV"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Paramètres"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Le terminal est en cours d\'exécution…"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Cliquez pour ouvrir le terminal."</string>
diff --git a/android/TerminalApp/res/values-fr/strings.xml b/android/TerminalApp/res/values-fr/strings.xml
index 17607e4..81dfdb6 100644
--- a/android/TerminalApp/res/values-fr/strings.xml
+++ b/android/TerminalApp/res/values-fr/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Installer le terminal Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Pour lancer le terminal Linux, vous devez télécharger environ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de données via le réseau.\nVoulez-vous continuer ?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Télécharger lorsque le Wi-Fi sera disponible"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installer"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installation…"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Erreur réseau. Vérifiez la connexion et réessayez."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Options de récupération de la partition"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Revenir à la version initiale"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Tout supprimer"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM réinitialisée"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Paramètres"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Le terminal est en cours d\'exécution"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Cliquez pour ouvrir le terminal."</string>
diff --git a/android/TerminalApp/res/values-gl/strings.xml b/android/TerminalApp/res/values-gl/strings.xml
index 93986e8..4acb214 100644
--- a/android/TerminalApp/res/values-gl/strings.xml
+++ b/android/TerminalApp/res/values-gl/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instalar o terminal de Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Para iniciar o terminal de Linux, tes que descargar aproximadamente <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de datos a través da rede.\nQueres continuar?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Descargar cando haxa wifi dispoñible"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalar"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalando"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Produciuse un erro da rede. Comproba a conexión e téntao de novo."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opcións de recuperación da partición"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Cambiar á versión inicial"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Quita todo"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Restableceuse a máquina virtual"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Configuración"</string>
<string name="service_notification_title" msgid="2918088850910713393">"O terminal está en funcionamento"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Fai clic para abrir o terminal."</string>
diff --git a/android/TerminalApp/res/values-gu/strings.xml b/android/TerminalApp/res/values-gu/strings.xml
index d50496d..aa0690e 100644
--- a/android/TerminalApp/res/values-gu/strings.xml
+++ b/android/TerminalApp/res/values-gu/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"ટર્મિનલ"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Linux ટર્મિનલ ઇન્સ્ટૉલ કરો"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ટર્મિનલ લૉન્ચ કરવા માટે, તમારે નેટવર્ક પર આશરે <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ડેટા ડાઉનલોડ કરવાની જરૂર છે.\nશું તમારે આગળ વધવું છે?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"જ્યારે વાઇ-ફાઇ ઉપલબ્ધ હોય, ત્યારે ડાઉનલોડ કરો"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ઇન્સ્ટૉલ કરો"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ઇન્સ્ટૉલ કરી રહ્યાં છીએ"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"નેટવર્ક ભૂલ. કનેક્શન ચેક કરો અને ફરી પ્રયાસ કરો."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux ટર્મિનલ ઇન્સ્ટૉલ કરી રહ્યાં છીએ"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"પ્રક્રિયા સમાપ્ત થયા પછી Linux ટર્મિનલ શરૂ થશે"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"નેટવર્કની સમસ્યાને કારણે ઇન્સ્ટૉલ કરવામાં નિષ્ફળ રહ્યાં"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"ઇન્સ્ટૉલ કરવામાં નિષ્ફળ રહ્યાં. ફરી પ્રયાસ કરો."</string>
<string name="action_settings" msgid="5729342767795123227">"સેટિંગ"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"ટર્મિનલ તૈયાર કરી રહ્યાં છીએ"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"ટર્મિનલ બંધ કરી રહ્યાં છીએ"</string>
@@ -58,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"પાર્ટિશન રિકવરીના વિકલ્પો"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"બદલીને પ્રારંભિક વર્ઝન કરો"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"તમામ કાઢી નાખો"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM રીસેટ"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"વર્ચ્યુઅલ મશીન રીસેટ કરો"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"ડેટા ડિલીટ કરવામાં આવશે."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"કન્ફર્મ કરો"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"રદ કરો"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"સેટિંગ"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ટર્મિનલ ચાલી રહ્યું છે"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ટર્મિનલ ખોલવા માટે ક્લિક કરો."</string>
diff --git a/android/TerminalApp/res/values-hi/strings.xml b/android/TerminalApp/res/values-hi/strings.xml
index 5d94688..3809fd5 100644
--- a/android/TerminalApp/res/values-hi/strings.xml
+++ b/android/TerminalApp/res/values-hi/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"टर्मिनल"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux टर्मिनल ऐप्लिकेशन इंस्टॉल करें"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux टर्मिनल ऐप्लिकेशन को लॉन्च करने के लिए, आपको इंटरनेट से <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> डेटा डाउनलोड करना होगा.\nक्या आपको आगे बढ़ना है?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"वाई-फ़ाई उपलब्ध होने पर डाउनलोड करें"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"इंस्टॉल करें"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"इंस्टॉल हो रहा"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"नेटवर्क की गड़बड़ी हुई. इंटरनेट कनेक्शन की जांच करें और फिर से कोशिश करें."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"इमेज के हिस्से को रिकवर करने के विकल्प"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"शुरुआती वर्शन पर स्विच करें"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"वीएम की सभी इमेज हटाएं"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"वीएम को रीसेट किया गया"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"वर्चुअल मशीन को रीसेट करें"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"डेटा मिटा दिया जाएगा."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"पुष्टि करें"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"रद्द करें"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"सेटिंग"</string>
<string name="service_notification_title" msgid="2918088850910713393">"टर्मिनल चालू है"</string>
<string name="service_notification_content" msgid="8652887364784704911">"टर्मिनल खोलने के लिए क्लिक करें."</string>
diff --git a/android/TerminalApp/res/values-hr/strings.xml b/android/TerminalApp/res/values-hr/strings.xml
index 27529b2..1817c19 100644
--- a/android/TerminalApp/res/values-hr/strings.xml
+++ b/android/TerminalApp/res/values-hr/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instaliranje Linux terminala"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Da biste pokrenuli Linux terminal, trebate preuzeti otprilike <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> podataka putem mreže.\nŽelite li nastaviti?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Preuzmi kada Wi-Fi bude dostupan"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instaliraj"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instaliranje"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Mrežna pogreška. Provjerite vezu i pokušajte ponovo."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opcije oporavka particije"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Promijeni na početnu verziju"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Ukloni sve"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM je vraćen na zadano"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Ponovno postavljanje virtualnog stroja"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Podaci će se izbrisati."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Potvrdi"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Odustani"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Postavke"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal je pokrenut"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliknite da biste otvorili terminal."</string>
diff --git a/android/TerminalApp/res/values-hu/strings.xml b/android/TerminalApp/res/values-hu/strings.xml
index fa429be..0d4c81d 100644
--- a/android/TerminalApp/res/values-hu/strings.xml
+++ b/android/TerminalApp/res/values-hu/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminál"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux-terminál telepítése"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"A Linux-terminál elindításához körülbelül <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> adatmennyiséget kell letöltenie a hálózaton keresztül.\nFolytatja?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Letöltés, ha rendelkezésre áll Wi-Fi-kapcsolat"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Telepítés"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Telepítés…"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Hálózati hiba. Ellenőrizze a kapcsolatot, majd próbálja újra."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Partíció-helyreállítási lehetőségek"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Váltás az eredeti verzióra"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Az összes eltávolítása"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM visszaállítása"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Beállítások"</string>
<string name="service_notification_title" msgid="2918088850910713393">"A terminál fut"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kattintson a terminál megnyitásához."</string>
diff --git a/android/TerminalApp/res/values-hy/strings.xml b/android/TerminalApp/res/values-hy/strings.xml
index a967b48..10a6104 100644
--- a/android/TerminalApp/res/values-hy/strings.xml
+++ b/android/TerminalApp/res/values-hy/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Տերմինալ"</string>
<string name="installer_title_text" msgid="500663060973466805">"Լինուքս տերմինալի տեղադրում"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Լինուքս տերմինալը գործարկելու համար անհրաժեշտ է ցանցի միջոցով ներբեռնել մոտ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> տվյալ։\nՇարունակե՞լ։"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Ներբեռնել, երբ սարքը միանա Wi-Fi-ին"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Տեղադրել"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Տեղադրվում է"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Ցանցի սխալ։ Ստուգեք կապը և նորից փորձեք։"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Բաժնի վերականգնման տարբերակներ"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Նախնական տարբերակի վերականգնում"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Հեռացնել բոլորը"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Վիրտուալ մեքենան վերակայվեց"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Կարգավորումներ"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Տերմինալն աշխատում է"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Սեղմեք՝ տերմինալը բացելու համար։"</string>
diff --git a/android/TerminalApp/res/values-in/strings.xml b/android/TerminalApp/res/values-in/strings.xml
index f2396cc..c5852fd 100644
--- a/android/TerminalApp/res/values-in/strings.xml
+++ b/android/TerminalApp/res/values-in/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Instal terminal Linux"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Untuk meluncurkan terminal Linux, Anda perlu mendownload sekitar <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> data melalui jaringan.\nApakah Anda ingin melanjutkan?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Download saat Wi-Fi tersedia"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instal"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Menginstal"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Error jaringan. Periksa koneksi dan coba lagi."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Menginstal terminal Linux"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Terminal Linux akan dimulai setelah penginstalan selesai"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Gagal menginstal karena ada masalah jaringan"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Gagal menginstal. Coba lagi."</string>
<string name="action_settings" msgid="5729342767795123227">"Setelan"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Menyiapkan terminal"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Menghentikan terminal"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opsi Pemulihan Partisi"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Ubah ke Versi awal"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Hapus semua"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Reset VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Setelan"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal sedang berjalan"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klik untuk membuka terminal."</string>
diff --git a/android/TerminalApp/res/values-is/strings.xml b/android/TerminalApp/res/values-is/strings.xml
index fb33853..6868859 100644
--- a/android/TerminalApp/res/values-is/strings.xml
+++ b/android/TerminalApp/res/values-is/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Tengi"</string>
<string name="installer_title_text" msgid="500663060973466805">"Setja upp Linux-útstöð"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Til að ræsa Linux-útstöð þarftu að sækja um <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> af gögnum yfir netkerfi.\nViltu halda áfram?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Sækja þegar Wi-Fi er tiltækt"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Setja upp"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Setur upp"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Netkerfisvilla. Athugaðu tenginguna og reyndu aftur."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Endurheimtarkostir deildar"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Breyta í upphaflega útgáfu"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Fjarlægja allt"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM endurstillt"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Endurstilltu sýndarvélina"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Gögnum verður eytt."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Staðfesta"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Hætta við"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Stillingar"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Stöð er í gangi"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Smelltu til að opna stöðina."</string>
diff --git a/android/TerminalApp/res/values-it/strings.xml b/android/TerminalApp/res/values-it/strings.xml
index bc04198..3742582 100644
--- a/android/TerminalApp/res/values-it/strings.xml
+++ b/android/TerminalApp/res/values-it/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminale"</string>
<string name="installer_title_text" msgid="500663060973466805">"Installa terminale Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Per avviare il terminale Linux, devi scaricare circa <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> di dati tramite la rete.\nContinuare?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Scarica quando è disponibile una rete Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installa"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installazione"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Errore di rete. Controlla la connessione e riprova."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opzioni ripristino partizione"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Cambia in versione iniziale"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Rimuovi tutto"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM reimpostata"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Reimposta la macchina virtuale"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"I dati verranno eliminati."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Conferma"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Annulla"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Impostazioni"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Il terminale è in esecuzione"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Fai clic per aprire il terminale."</string>
diff --git a/android/TerminalApp/res/values-iw/strings.xml b/android/TerminalApp/res/values-iw/strings.xml
index 3864119..91a865e 100644
--- a/android/TerminalApp/res/values-iw/strings.xml
+++ b/android/TerminalApp/res/values-iw/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"טרמינל"</string>
<string name="installer_title_text" msgid="500663060973466805">"התקנה של טרמינל Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"כדי להפעיל את טרמינל Linux, צריך להוריד נתונים בנפח של בערך <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> דרך הרשת.\nלהמשיך?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"הורדה כשיהיה חיבור ל-Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"התקנה"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"בתהליך התקנה"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"שגיאה בחיבור לרשת. צריך לבדוק את החיבור ולנסות שוב."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"אפשרויות שחזור של המחיצה"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"שינוי לגרסה הראשונית"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"הסרת הכול"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"איפוס VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"הגדרות"</string>
<string name="service_notification_title" msgid="2918088850910713393">"הטרמינל פועל"</string>
<string name="service_notification_content" msgid="8652887364784704911">"צריך ללחוץ כדי לפתוח את הטרמינל."</string>
diff --git a/android/TerminalApp/res/values-ja/strings.xml b/android/TerminalApp/res/values-ja/strings.xml
index 32c2e87..0920329 100644
--- a/android/TerminalApp/res/values-ja/strings.xml
+++ b/android/TerminalApp/res/values-ja/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"ターミナル"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux ターミナルをインストールする"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ターミナルを起動するには、ネットワーク経由で約 <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> のデータのダウンロードが必要です。\n続行しますか?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi 接続時にダウンロード"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"インストール"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"インストール中"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"ネットワーク エラーです。接続を確認し、もう一度お試しください。"</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"パーティション復元オプション"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"最初のバージョンに変更"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"すべて削除"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM をリセットしました"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"仮想マシンのリセット"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"データは削除されます。"</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"確認"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"キャンセル"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"設定"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ターミナルは実行中です"</string>
<string name="service_notification_content" msgid="8652887364784704911">"クリックするとターミナルが開きます。"</string>
diff --git a/android/TerminalApp/res/values-ka/strings.xml b/android/TerminalApp/res/values-ka/strings.xml
index 2b2bbfa..7546f2b 100644
--- a/android/TerminalApp/res/values-ka/strings.xml
+++ b/android/TerminalApp/res/values-ka/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"ტერმინალი"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux ტერმინალის ინსტალაცია"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ტერმინალის გაშვებისთვის საჭიროა ქსელიდან ჩამოტვირთოთ დაახლოებით <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ზომის მონაცემები.\nგსურთ გაგრძელება?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ჩამოტვირთვა Wi-Fi კავშირის ხელმისაწვდომობისას"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ინსტალაცია"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ინსტალირდება"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"ქსელის შეცდომა. შეამოწმეთ კავშირი და ცადეთ ხელახლა."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"დანაყოფის აღდგენის ვარიანტები"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"საწყის ვერსიაზე შეცვლა"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"ყველას ამოშლა"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"ვირტუალური მანქანის გადაყენება"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"ვირტუალური მანქანის გადაყენება"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"მონაცემები წაიშლება."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"დადასტურება"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"გაუქმება"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"პარამეტრები"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ტერმინალი გაშვებულია"</string>
<string name="service_notification_content" msgid="8652887364784704911">"დააწკაპუნეთ ტერმინალის გასახსნელად."</string>
diff --git a/android/TerminalApp/res/values-kk/strings.xml b/android/TerminalApp/res/values-kk/strings.xml
index 361e27b..013f16a 100644
--- a/android/TerminalApp/res/values-kk/strings.xml
+++ b/android/TerminalApp/res/values-kk/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Терминал"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux терминалын орнату"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux терминалын іске қосу үшін желі арқылы шамамен <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> деректі жүктеп алу қажет.\nЖалғастырасыз ба?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi желісі пайда болғанда жүктеп алу"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Орнату"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Орнатылып жатыр"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Желі қатесі орын алды. Байланысты тексеріңіз де, қайталап көріңіз."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Бөлікті қалпына келтіру опциялары"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Бастапқы нұсқаға өзгерту"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Барлығын өшіру"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Виртуалдық машина қайта орнатылды."</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Параметрлер"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Терминал іске қосылып тұр"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Терминалды ашу үшін басыңыз."</string>
diff --git a/android/TerminalApp/res/values-km/strings.xml b/android/TerminalApp/res/values-km/strings.xml
index bd166a6..9ec627c 100644
--- a/android/TerminalApp/res/values-km/strings.xml
+++ b/android/TerminalApp/res/values-km/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"ទែមីណាល់"</string>
<string name="installer_title_text" msgid="500663060973466805">"ដំឡើងទែមីណាល់ Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"ដើម្បីបើកដំណើរការទែមីណាល់ Linux អ្នកត្រូវទាញយកទិន្នន័យប្រហែលជា <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> នៅលើបណ្តាញ។\nតើអ្នកចង់បន្តដែរឬទេ?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ទាញយកនៅពេលមាន Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ដំឡើង"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"កំពុងដំឡើង"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"មានបញ្ហាបណ្ដាញ។ ពិនិត្យមើលការតភ្ជាប់ រួចព្យាយាមម្ដងទៀត។"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"ជម្រើសស្ដារផ្នែក"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ប្ដូរទៅកំណែដំបូង"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"ដកចេញទាំងអស់"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"បានកំណត់ VM ឡើងវិញ"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ការកំណត់"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ទែមីណាល់កំពុងដំណើរការ"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ចុចដើម្បីបើកទែមីណាល់។"</string>
diff --git a/android/TerminalApp/res/values-kn/strings.xml b/android/TerminalApp/res/values-kn/strings.xml
index 346f5a3..c79be48 100644
--- a/android/TerminalApp/res/values-kn/strings.xml
+++ b/android/TerminalApp/res/values-kn/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"ಟರ್ಮಿನಲ್"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux ಟರ್ಮಿನಲ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ಟರ್ಮಿನಲ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು, ನೀವು ನೆಟ್ವರ್ಕ್ನಲ್ಲಿ ಸುಮಾರು <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ಡೇಟಾವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\nನೀವು ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ವೈ-ಫೈ ಲಭ್ಯವಿದ್ದಾಗ ಡೌನ್ಲೋಡ್ ಮಾಡಿ"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ಇನ್ಸ್ಟಾಲ್"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"ನೆಟ್ವರ್ಕ್ ದೋಷ. ಕನೆಕ್ಷನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"ಪಾರ್ಟಿಶನ್ ರಿಕವರಿ ಆಯ್ಕೆಗಳು"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ಆರಂಭಿಕ ಆವೃತ್ತಿಗೆ ಬದಲಾಯಿಸಿ"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕಿ"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM ರೀಸೆಟ್"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ಟರ್ಮಿನಲ್ ರನ್ ಆಗುತ್ತಿದೆ"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ಟರ್ಮಿನಲ್ ಅನ್ನು ತೆರೆಯಲು ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
diff --git a/android/TerminalApp/res/values-ko/strings.xml b/android/TerminalApp/res/values-ko/strings.xml
index a2262a4..99cb694 100644
--- a/android/TerminalApp/res/values-ko/strings.xml
+++ b/android/TerminalApp/res/values-ko/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"터미널"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux 터미널 설치"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux 터미널을 실행하려면 네트워크를 통해 약 <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g>의 데이터를 다운로드해야 합니다.\n계속하시겠습니까?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi 연결 시 다운로드"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"설치"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"설치 중"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"네트워크 오류입니다. 연결을 확인한 후 다시 시도해 주세요."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"파티션 복구 옵션"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"최초 버전으로 변경"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"전체 삭제"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM 재설정"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"설정"</string>
<string name="service_notification_title" msgid="2918088850910713393">"터미널이 실행 중입니다"</string>
<string name="service_notification_content" msgid="8652887364784704911">"터미널을 열려면 클릭하세요."</string>
diff --git a/android/TerminalApp/res/values-ky/strings.xml b/android/TerminalApp/res/values-ky/strings.xml
index 9d378c9..3d2ebf1 100644
--- a/android/TerminalApp/res/values-ky/strings.xml
+++ b/android/TerminalApp/res/values-ky/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Терминал"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux терминалын орнотуу"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux терминалын иштетүү үчүн болжол менен <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> жүктөп алышыңыз керек.\nУлантасызбы?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi жеткиликтүү болгондо жүктөп алуу"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Орнотуу"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Орнотулууда"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Тармак катасы. Байланышты текшерип, кайра аракет кылыңыз."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Катуу диск бөлүгүн калыбына келтирүү параметрлери"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Баштапкы версияга өзгөртүү"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Баарын өчүрүү"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Виртуалдык машина баштапкы абалга келтирилди"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Параметрлер"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Терминал иштеп жатат"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Терминалды ачуу үчүн чыкылдатыңыз."</string>
diff --git a/android/TerminalApp/res/values-lo/strings.xml b/android/TerminalApp/res/values-lo/strings.xml
index 5794018..2ef7e67 100644
--- a/android/TerminalApp/res/values-lo/strings.xml
+++ b/android/TerminalApp/res/values-lo/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"ສະຖານີ"</string>
<string name="installer_title_text" msgid="500663060973466805">"ຕິດຕັ້ງເທີມິນອນ Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"ເພື່ອເປີດໃຊ້ເທີມິນອນ Linux, ທ່ານຕ້ອງດາວໂຫຼດຂໍ້ມູນປະມານ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ຜ່ານເຄືອຂ່າຍ.\nທ່ານຕ້ອງການດຳເນີນການຕໍ່ບໍ?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ດາວໂຫຼດເມື່ອມີການເຊື່ອມຕໍ່ Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ຕິດຕັ້ງ"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ກຳລັງຕິດຕັ້ງ"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"ເຄືອຂ່າຍຜິດພາດ. ກວດສອບການເຊື່ອມຕໍ່ແລ້ວລອງໃໝ່."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"ຕົວເລືອກການກູ້ຄືນພາທິຊັນ"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ປ່ຽນເປັນເວີຊັນເລີ່ມຕົ້ນ"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"ລຶບທັງໝົດອອກ"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"ຣີເຊັດ VM"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"ຣີເຊັດເຄື່ອງຈັກສະເໝືອນ"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"ຂໍ້ມູນຈະຖືກລຶບ."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"ຢືນຢັນ"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"ຍົກເລີກ"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"ການຕັ້ງຄ່າ"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ເທີມິນອນກຳລັງເຮັດວຽກຢູ່"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ຄລິກເພື່ອເປີດເທີມິນອນ."</string>
diff --git a/android/TerminalApp/res/values-lt/strings.xml b/android/TerminalApp/res/values-lt/strings.xml
index 2506ad3..b17f9e5 100644
--- a/android/TerminalApp/res/values-lt/strings.xml
+++ b/android/TerminalApp/res/values-lt/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminalas"</string>
<string name="installer_title_text" msgid="500663060973466805">"„Linux“ terminalo diegimas"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Norėdami paleisti „Linux“ terminalą, per tinklą turite atsisiųsti apytiksliai <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> duomenų.\nAr norite tęsti?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Atsisiųsti, kai pasiekiamas „Wi-Fi“"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Įdiegti"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Diegiama"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Tinklo klaida. Patikrinkite ryšį ir bandykite dar kartą."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Skaidinio atkūrimo parinktys"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Keitimas į pradinę versiją"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Pašalinti viską"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM nustatymas iš naujo"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Nustatymai"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminalas veikia"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Spustelėkite, kad atidarytumėte terminalą."</string>
diff --git a/android/TerminalApp/res/values-lv/strings.xml b/android/TerminalApp/res/values-lv/strings.xml
index cccd57e..1d5249f 100644
--- a/android/TerminalApp/res/values-lv/strings.xml
+++ b/android/TerminalApp/res/values-lv/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminālis"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux termināļa instalēšana"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Lai palaistu Linux termināli, jums jālejupielādē aptuveni <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> datu, izmantojot tīklu.\nVai vēlaties turpināt?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Lejupielādēt, kad ir pieejams Wi-Fi savienojums"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalēt"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalē"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Tīkla kļūda. Pārbaudiet savienojumu un mēģiniet vēlreiz."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Nodalījuma atkopšanas opcijas"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Mainīšana uz sākotnējo versiju"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Noņemt visu"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Virtuālā mašīna ir atiestatīta."</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Iestatījumi"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminālis darbojas"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Noklikšķiniet, lai atvērtu termināli."</string>
diff --git a/android/TerminalApp/res/values-mk/strings.xml b/android/TerminalApp/res/values-mk/strings.xml
index e949519..78bdab6 100644
--- a/android/TerminalApp/res/values-mk/strings.xml
+++ b/android/TerminalApp/res/values-mk/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Терминал"</string>
<string name="installer_title_text" msgid="500663060973466805">"Инсталирајте го Linux-терминалот"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"За да го стартувате Linux-терминалот, треба да преземете податоци од приближно <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> преку мрежата.\nДали сакате да продолжите?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Преземете кога има Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Инсталирај"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Се инсталира"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Грешка на мрежата. Проверете ја врската и обидете се повторно."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Опции за враќање партиции"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Промени на првата верзија"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Отстрани ги сите"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM е ресетирана"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Поставки"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Терминалот е активен"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Кликнете за да го отворите терминалот."</string>
diff --git a/android/TerminalApp/res/values-ml/strings.xml b/android/TerminalApp/res/values-ml/strings.xml
index c8bc709..4561d06 100644
--- a/android/TerminalApp/res/values-ml/strings.xml
+++ b/android/TerminalApp/res/values-ml/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"ടെർമിനൽ"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Linux ടെർമിനൽ ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ടെർമിനൽ ലോഞ്ച് ചെയ്യാൻ, നിങ്ങൾക്ക് നെറ്റ്വർക്കിലൂടെ ഏകദേശം <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ഡാറ്റ ഡൗൺലോഡ് ചെയ്യേണ്ടതുണ്ട്.\nനിങ്ങൾ തുടരുമോ?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"വൈഫൈ ലഭ്യമാകുമ്പോൾ ഡൗൺലോഡ് ചെയ്യുക"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ഇൻസ്റ്റാൾ ചെയ്യൂ"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ഇൻസ്റ്റാൾ ചെയ്യുന്നു"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"നെറ്റ്വർക്ക് പിശക്. കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux ടെർമിനൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നു"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"പൂർത്തിയായിക്കഴിഞ്ഞാൽ, Linux ടെർമിനൽ ഇൻസ്റ്റാൾ ചെയ്യാൻ ആരംഭിക്കും"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"നെറ്റ്വർക്കുമായി ബന്ധപ്പെട്ട് പ്രശ്നമുണ്ടായതിനാൽ ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="action_settings" msgid="5729342767795123227">"ക്രമീകരണം"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"ടെർമിനൽ തയ്യാറാക്കുന്നു"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"ടെർമിനൽ നിർത്തുന്നു"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"പാർട്ടീഷൻ വീണ്ടെടുക്കൽ ഓപ്ഷനുകൾ"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"പ്രാരംഭ പതിപ്പിലേക്ക് മാറ്റുക"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"എല്ലാം നീക്കം ചെയ്യുക"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM റീസെറ്റ് ചെയ്തു"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ക്രമീകരണം"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ടെർമിനൽ റൺ ചെയ്യുന്നു"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ടെർമിനൽ തുറക്കാൻ ക്ലിക്ക് ചെയ്യുക."</string>
diff --git a/android/TerminalApp/res/values-mn/strings.xml b/android/TerminalApp/res/values-mn/strings.xml
index eb7693a..ea87db6 100644
--- a/android/TerminalApp/res/values-mn/strings.xml
+++ b/android/TerminalApp/res/values-mn/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Терминал"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux terminal-г суулгах"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux терминалыг эхлүүлэхийн тулд та сүлжээгээр барагцаагаар <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g>-н өгөгдөл татах шаардлагатай.\nТа үргэлжлүүлэх үү?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi боломжтой үед татах"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Суулгах"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Суулгаж байна"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Сүлжээний алдаа гарлаа. Холболтыг шалгаж, дахин оролдоно уу."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Хуваалтыг сэргээх сонголтууд"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Анхны хувилбар луу өөрчлөх"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Бүгдийг хасах"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM-г шинэчлэх"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Виртуал машиныг шинэчлэх"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Өгөгдлийг устгана."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Баталгаажуулах"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Цуцлах"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Тохиргоо"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Терминал ажиллаж байна"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Терминалыг нээхийн тулд товшино уу."</string>
diff --git a/android/TerminalApp/res/values-mr/strings.xml b/android/TerminalApp/res/values-mr/strings.xml
index 1d3f65b..93eca7a 100644
--- a/android/TerminalApp/res/values-mr/strings.xml
+++ b/android/TerminalApp/res/values-mr/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"टर्मिनल"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Linux टर्मिनल इंस्टॉल करा"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux टर्मिनल लाँच करण्यासाठी, तुम्ही नेटवर्कवरून अंदाजे <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> डेटा डाउनलोड करणे आवश्यक आहे.\nतुम्हाला पुढे सुरू ठेवायचे आहे का?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"वाय-फाय उपलब्ध असताना डाउनलोड करा"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"इंस्टॉल करा"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"इंस्टॉल करत आहे"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"नेटवर्क एरर. कनेक्शन तपासून पुन्हा प्रयत्न करा."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux टर्मिनल इंस्टॉल करत आहे"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"पूर्ण झाल्यानंतर Linux टर्मिनल सुरू होईल"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"नेटवर्कच्या समस्येमुळे इंस्टॉल करता आले नाही"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"इंस्टॉल करता आले नाही. पुन्हा प्रयत्न करा."</string>
<string name="action_settings" msgid="5729342767795123227">"सेटिंग्ज"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"टर्मिनल तयार करत आहे"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"टर्मिनल थांबवत आहे"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"पार्टिशनचे रिकव्हरी पर्याय"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"मूळ आवृत्तीवर बदला"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"सर्व काढून टाका"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"व्हर्च्युअल मशीन रीसेट केली आहे"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"सेटिंग्ज"</string>
<string name="service_notification_title" msgid="2918088850910713393">"टर्मिनल रन होत आहे"</string>
<string name="service_notification_content" msgid="8652887364784704911">"टर्मिनल उघडण्यासाठी क्लिक करा."</string>
diff --git a/android/TerminalApp/res/values-ms/strings.xml b/android/TerminalApp/res/values-ms/strings.xml
index 1003ed0..2431f43 100644
--- a/android/TerminalApp/res/values-ms/strings.xml
+++ b/android/TerminalApp/res/values-ms/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Pasang terminal Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Untuk melancarkan terminal Linux, anda perlu memuat turun anggaran <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> data melalui rangkaian.\nAdakah anda mahu meneruskan proses?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Muat turun apabila Wi-Fi tersedia"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Pasang"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Memasang"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Ralat rangkaian. Semak sambungan dan cuba lagi."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Pilihan pemulihan Pemetakan"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Tukar kepada Versi awal"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Alih keluar semua"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Tetapan semula VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Tetapan"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal sedang dijalankan"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klik untuk membuka terminal."</string>
diff --git a/android/TerminalApp/res/values-my/strings.xml b/android/TerminalApp/res/values-my/strings.xml
index 7ce203a..c399dd7 100644
--- a/android/TerminalApp/res/values-my/strings.xml
+++ b/android/TerminalApp/res/values-my/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"တာမီနယ်"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux တာမီနယ်ကို ထည့်သွင်းခြင်း"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux တာမီနယ်ကို စတင်ရန်အတွက် ကွန်ရက်ပေါ်တွင် အကြမ်းဖျင်း ဒေတာ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ကို ဒေါင်းလုဒ်လုပ်ရမည်။\nရှေ့ဆက်လိုပါသလား။"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi ရသည့်အခါ ဒေါင်းလုဒ်လုပ်ရန်"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ထည့်သွင်းရန်"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ထည့်သွင်းနေသည်"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"ကွန်ရက် အမှားအယွင်း။ ချိတ်ဆက်မှုကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ။"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"အကန့်ပြန်ရယူရေး နည်းလမ်းများ"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ကနဦးဗားရှင်းသို့ ပြောင်းရန်"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"အားလုံး ဖယ်ရှားရန်"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM ပြင်ဆင်သတ်မှတ်ပြီးပြီ"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ဆက်တင်များ"</string>
<string name="service_notification_title" msgid="2918088850910713393">"တာမီနယ်ကို ဖွင့်ထားသည်"</string>
<string name="service_notification_content" msgid="8652887364784704911">"တာမီနယ်ဖွင့်ရန် နှိပ်ပါ။"</string>
diff --git a/android/TerminalApp/res/values-nb/strings.xml b/android/TerminalApp/res/values-nb/strings.xml
index b0db3d1..f335b2e 100644
--- a/android/TerminalApp/res/values-nb/strings.xml
+++ b/android/TerminalApp/res/values-nb/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Installer Linux-terminalen"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"For å starte Linux-terminalen må du laste ned omtrent <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> data via nettverket.\nVil du fortsette?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Last ned når wifi er tilgjengelig"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installer"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installerer"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Nettverksfeil. Sjekk tilkoblingen og prøv på nytt."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Gjenopprettingsalternativer for partisjoner"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Bytt til første versjon"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Fjern alle"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM-tilbakestilling"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Innstillinger"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminalen kjører"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klikk for å åpne terminalen."</string>
diff --git a/android/TerminalApp/res/values-ne/strings.xml b/android/TerminalApp/res/values-ne/strings.xml
index f9b079c..b3e73f0 100644
--- a/android/TerminalApp/res/values-ne/strings.xml
+++ b/android/TerminalApp/res/values-ne/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"टर्मिनल"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux टर्मिनल इन्स्टल गर्नुहोस्"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux टर्मिनल लन्च गर्नका निम्ति, तपाईंले नेटवर्क प्रयोग गरेर लगभग <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> जति डेटा डाउनलोड गर्नु पर्ने हुन्छ।\nतपाईं अघि बढ्नुहुन्छ?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi उपलब्ध हुँदा डाउनलोड गर्नुहोस्"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"इन्स्टल गर्नुहोस्"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"इन्स्टल गरिँदै छ"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"नेटवर्कसम्बन्धी त्रुटि। कनेक्सन जाँच गर्नुहोस् र फेरि प्रयास गर्नुहोस्।"</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"पार्टिसन रिकभरीसम्बन्धी विकल्पहरू"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"यो संस्करण बदलेर सुरुको संस्करण बनाउनुहोस्"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"सबै हटाउनुहोस्"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM रिसेट गर्नुहोस्"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"भर्चुअल मेसिन रिसेट गर्नुहोस्"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"डेटा मेटाइने छ।"</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"पुष्टि गर्नुहोस्"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"रद्द गर्नुहोस्"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"सेटिङ"</string>
<string name="service_notification_title" msgid="2918088850910713393">"टर्मिनल चलिरहेको छ"</string>
<string name="service_notification_content" msgid="8652887364784704911">"टर्मिनल खोल्न क्लिक गर्नुहोस्।"</string>
diff --git a/android/TerminalApp/res/values-nl/strings.xml b/android/TerminalApp/res/values-nl/strings.xml
index 662fdfa..65b2169 100644
--- a/android/TerminalApp/res/values-nl/strings.xml
+++ b/android/TerminalApp/res/values-nl/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux-terminal installeren"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Als je Linux-terminal wilt starten, moet je ongeveer <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> aan data downloaden via het netwerk.\nWil je doorgaan?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Downloaden als wifi beschikbaar is"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installeren"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installeren"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Netwerkfout. Check de verbinding en probeer het opnieuw."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Herstelopties voor partities"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Wijzigen naar eerste versie"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Alles verwijderen"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM gereset"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"De virtuele machine resetten"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Gegevens worden verwijderd."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Bevestigen"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Annuleren"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Instellingen"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal wordt uitgevoerd"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klik om de terminal te openen."</string>
diff --git a/android/TerminalApp/res/values-or/strings.xml b/android/TerminalApp/res/values-or/strings.xml
index c0e4138..f542986 100644
--- a/android/TerminalApp/res/values-or/strings.xml
+++ b/android/TerminalApp/res/values-or/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Linux ଟର୍ମିନାଲକୁ ଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ଟର୍ମିନାଲ ଲଞ୍ଚ କରିବାକୁ ଆପଣଙ୍କୁ ନେଟୱାର୍କ ମାଧ୍ୟମରେ ପ୍ରାୟ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g>ର ଡାଟା ଡାଉନଲୋଡ କରିବାକୁ ହେବ।\nଆପଣ ଆଗକୁ ବଢ଼ିବେ?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ୱାଇ-ଫାଇ ଉପଲବ୍ଧ ହେଲେ ଡାଉନଲୋଡ କରନ୍ତୁ"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ଇନଷ୍ଟଲ କରାଯାଉଛି"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"ନେଟୱାର୍କ ତ୍ରୁଟି। କନେକ୍ସନ ଯାଞ୍ଚ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux ଟର୍ମିନାଲକୁ ଇନଷ୍ଟଲ କରାଯାଉଛି"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"ପ୍ରକ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ହେବା ପରେ Linux ଟର୍ମିନାଲ ଆରମ୍ଭ ହେବ"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"ନେଟୱାର୍କ ସମସ୍ୟା ଯୋଗୁଁ ଇନଷ୍ଟଲ କରିବାରେ ବିଫଳ ହୋଇଛି"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"ଇନଷ୍ଟଲ କରିବାରେ ବିଫଳ ହୋଇଛି। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
<string name="action_settings" msgid="5729342767795123227">"ସେଟିଂସ"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Terminalକୁ ପ୍ରସ୍ତୁତ କରାଯାଉଛି"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Terminalକୁ ବନ୍ଦ କରାଯାଉଛି"</string>
@@ -58,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"ପାର୍ଟିସନ ରିକଭରି ବିକଳ୍ପ"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ପ୍ରାରମ୍ଭିକ ଭର୍ସନକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"ସବୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM ରିସେଟ ହୋଇଛି"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"ଭର୍ଚୁଆଲ ମସିନ ରିସେଟ କରନ୍ତୁ"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"ଡାଟାକୁ ଡିଲିଟ କରାଯିବ।"</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"ସେଟିଂସ"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ଟର୍ମିନାଲ ଚାଲୁ ଅଛି"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ଟର୍ମିନାଲ ଖୋଲିବାକୁ କ୍ଲିକ କରନ୍ତୁ।"</string>
diff --git a/android/TerminalApp/res/values-pa/strings.xml b/android/TerminalApp/res/values-pa/strings.xml
index 04ccdf7..d1e9c18 100644
--- a/android/TerminalApp/res/values-pa/strings.xml
+++ b/android/TerminalApp/res/values-pa/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"ਟਰਮੀਨਲ"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux ਟਰਮੀਨਲ ਐਪ ਸਥਾਪਤ ਕਰੋ"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ਟਰਮੀਨਲ ਐਪ ਨੂੰ ਲਾਂਚ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਨੈੱਟਵਰਕ \'ਤੇ ਲਗਭਗ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ਡਾਟਾ ਡਾਊਨਲੋਡ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।\nਕੀ ਅੱਗੇ ਵਧਣਾ ਹੈ?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ਵਾਈ-ਫਾਈ ਦੇ ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਡਾਊਨਲੋਡ ਕਰੋ"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ਸਥਾਪਤ ਕਰੋ"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ਸਥਾਪਤ ਹੋ ਰਹੀ ਹੈ"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"ਨੈੱਟਵਰਕ ਗੜਬੜ। ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰ ਕੇ ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"ਪਾਰਟੀਸ਼ਨ ਰਿਕਵਰੀ ਦੇ ਵਿਕਲਪ"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ਸ਼ੁਰੂਆਤੀ ਵਰਜਨ \'ਤੇ ਬਦਲੋ"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"ਸਭ ਹਟਾਓ"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM ਰੀਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ਸੈਟਿੰਗਾਂ"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ਟਰਮੀਨਲ ਚਾਲੂ ਹੈ"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ਟਰਮੀਨਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਕਲਿੱਕ ਕਰੋ।"</string>
diff --git a/android/TerminalApp/res/values-pl/strings.xml b/android/TerminalApp/res/values-pl/strings.xml
index a250099..4e4d4bb 100644
--- a/android/TerminalApp/res/values-pl/strings.xml
+++ b/android/TerminalApp/res/values-pl/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Zainstaluj terminal Linuxa"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Aby uruchomić terminal Linuxa, musisz pobrać przez sieć około <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> danych.\nChcesz kontynuować?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Pobierz, gdy będzie dostępna sieć Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Zainstaluj"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instaluję"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Błąd sieci. Sprawdź połączenie i spróbuj ponownie."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opcje odzyskiwania partycji"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Zmień na wersję początkową"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Usuń wszystko"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Maszyna wirtualna została zresetowana"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Zresetuj maszynę wirtualną"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Dane zostaną usunięte."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Potwierdź"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Anuluj"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Ustawienia"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal jest uruchomiony"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliknij, aby otworzyć terminal."</string>
diff --git a/android/TerminalApp/res/values-pt-rPT/strings.xml b/android/TerminalApp/res/values-pt-rPT/strings.xml
index ca65ea2..6baf351 100644
--- a/android/TerminalApp/res/values-pt-rPT/strings.xml
+++ b/android/TerminalApp/res/values-pt-rPT/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instale o terminal do Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Para iniciar o terminal do Linux, tem de transferir cerca de <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de dados através da rede.\nQuer continuar?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Transferir quando estiver disponível uma rede Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalar"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"A instalar…"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Erro de rede. Verifique a ligação e tente novamente."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opções de recuperação de partições"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Altere para a versão inicial"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Remova tudo"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Reposição da VM"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Reponha a máquina virtual"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Os dados vão ser eliminados."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Confirmar"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Cancelar"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Definições"</string>
<string name="service_notification_title" msgid="2918088850910713393">"O terminal está em execução"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Clique para abrir o terminal."</string>
diff --git a/android/TerminalApp/res/values-pt/strings.xml b/android/TerminalApp/res/values-pt/strings.xml
index dd60e2a..c41847b 100644
--- a/android/TerminalApp/res/values-pt/strings.xml
+++ b/android/TerminalApp/res/values-pt/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instalar terminal Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Para iniciar o terminal Linux, é necessário baixar cerca de <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de dados pela rede.\nVocê quer continuar?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Baixar quando o Wi-Fi estiver disponível"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalar"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Instalando"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Erro de rede. Verifique a conexão e tente de novo."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opções de recuperação da partição"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Mudar para a versão inicial"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Remover tudo"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Redefinição da VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Configurações"</string>
<string name="service_notification_title" msgid="2918088850910713393">"O terminal está em execução"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Clique para abrir o terminal."</string>
diff --git a/android/TerminalApp/res/values-ro/strings.xml b/android/TerminalApp/res/values-ro/strings.xml
index 4847323..1537f81 100644
--- a/android/TerminalApp/res/values-ro/strings.xml
+++ b/android/TerminalApp/res/values-ro/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Instalează terminalul Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Pentru a lansa terminalul Linux, trebuie să descarci aproximativ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> de date prin rețea.\nVrei să continui?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Descarcă atunci când este disponibilă o conexiune Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalează"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Se instalează"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Eroare de rețea. Verifică-ți conexiunea și încearcă din nou."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opțiuni de recuperare a partițiilor"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Schimbă la versiunea inițială"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Elimină-le pe toate"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Resetarea MV"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Setări"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminalul rulează"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Dă clic pentru a deschide terminalul."</string>
diff --git a/android/TerminalApp/res/values-ru/strings.xml b/android/TerminalApp/res/values-ru/strings.xml
index 2e63eee..e901191 100644
--- a/android/TerminalApp/res/values-ru/strings.xml
+++ b/android/TerminalApp/res/values-ru/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Терминал"</string>
<string name="installer_title_text" msgid="500663060973466805">"Установка терминала Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Для запуска терминала Linux нужно скачать примерно <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> данных по сети.\nПродолжить?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Скачать только через Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Установить"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Установка"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Ошибка сети. Проверьте подключение и повторите попытку."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Варианты восстановления разделов"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Восстановить первоначальную версию"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Удалить все"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Настройки ВМ сброшены."</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Сбросьте виртуальную машину"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Данные будут удалены."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Подтвердить"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Отмена"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Настройки"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Терминал запущен"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Нажмите, чтобы открыть его."</string>
diff --git a/android/TerminalApp/res/values-si/strings.xml b/android/TerminalApp/res/values-si/strings.xml
index f175f19..1c12778 100644
--- a/android/TerminalApp/res/values-si/strings.xml
+++ b/android/TerminalApp/res/values-si/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"පර්යන්තය"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Linux ටර්මිනලය ස්ථාපනය කරන්න"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ටර්මිනලය දියත් කිරීමට, ඔබට ජාලය හරහා දත්ත <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> පමණ බාගත කිරීමට අවශ්ය වේ.\nඔබ ඉදිරියට යනවා ද?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi ලබා ගත හැකි විට බාගන්න"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ස්ථාපනය කරන්න"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ස්ථාපනය කරමින්"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"ජාල දෝෂයකි. සම්බන්ධතාවය පරීක්ෂා කර යළි උත්සාහ කරන්න."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux ටර්මිනලය ස්ථාපනය කරමින්"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Linux ටර්මිනලය අවසන් වූ පසු ආරම්භ වනු ඇත"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"ජාල ගැටලුවක් හේතුවෙන් ස්ථාපනය කිරීමට අසමත් විය"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"ස්ථාපනය කිරීමට අසමත් විය. නැවත උත්සාහ කරන්න."</string>
<string name="action_settings" msgid="5729342767795123227">"සැකසීම්"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"ටර්මිනලය සූදානම් කිරීම"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"ටර්මිනලය නතර කිරීම"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"කොටස් ප්රතිසාන විකල්ප"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ආරම්භක අනුවාදයට වෙනස් කරන්න"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"සියල්ල ඉවත් කරන්න"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM යළි සැකසීම"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"සැකසීම්"</string>
<string name="service_notification_title" msgid="2918088850910713393">"පර්යන්තය ධාවනය වේ"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ටර්මිනලය විවෘත කිරීමට ක්ලික් කරන්න."</string>
diff --git a/android/TerminalApp/res/values-sk/strings.xml b/android/TerminalApp/res/values-sk/strings.xml
index 7db2d94..7416854 100644
--- a/android/TerminalApp/res/values-sk/strings.xml
+++ b/android/TerminalApp/res/values-sk/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminál"</string>
<string name="installer_title_text" msgid="500663060973466805">"Inštalácia terminálu systému Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Ak chcete spustiť terminál systému Linux, musíte cez sieť stiahnuť približne <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> dát.\nChcete pokračovať?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Stiahnuť, keď bude k dispozícii Wi‑Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Inštalovať"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Inštaluje sa"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Chyba siete. Skontrolujte pripojenie a skúste to znova."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Možnosti obnovenia oddielu"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Zmena na pôvodnú verziu"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Odstrániť všetko"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Virtuálny počítač je resetovaný"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Nastavenia"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminál je spustený"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliknutím otvorte terminál."</string>
diff --git a/android/TerminalApp/res/values-sl/strings.xml b/android/TerminalApp/res/values-sl/strings.xml
index b97fcd3..4113c8d 100644
--- a/android/TerminalApp/res/values-sl/strings.xml
+++ b/android/TerminalApp/res/values-sl/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Namestitev terminala Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Če želite zagnati terminal Linux, morate prek omrežja prenesti približno <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> podatkov.\nAli želite nadaljevati?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Prenesi, ko bo na voljo Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Namesti"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Nameščanje"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Omrežna napaka. Preverite povezavo in poskusite znova."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Možnosti obnovitve particije"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Spremeni v začetno različico"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Odstrani vse"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Navidezni računalnik je bil ponastavljen"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Ponastavitev navideznega računalnika"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Podatki bodo izbrisani."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Potrdi"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Prekliči"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Nastavitve"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal se izvaja"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliknite, če želite odpreti terminal."</string>
diff --git a/android/TerminalApp/res/values-sq/strings.xml b/android/TerminalApp/res/values-sq/strings.xml
index 754d2ec..fbbbf6d 100644
--- a/android/TerminalApp/res/values-sq/strings.xml
+++ b/android/TerminalApp/res/values-sq/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Terminali"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Instalo terminalin e Linux"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Për të hapur terminalin e Linux, duhet të shkarkosh afërsisht <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> të dhëna nëpërmjet rrjetit.\nDëshiron të vazhdosh?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Shkarko kur të ofrohet Wi-Fi"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Instalo"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Po instalohet"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Gabim në rrjet. Kontrollo lidhjen dhe provo përsëri."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Terminali i Linux po instalohet"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Terminali i Linux do të niset pas përfundimit"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Instalimi dështoi për shkak të një problemi të rrjetit"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Instalimi dështoi. Provo përsëri."</string>
<string name="action_settings" msgid="5729342767795123227">"Cilësimet"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Terminali po përgatitet"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Terminali po ndalohet"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Opsionet e rikuperimit të ndarjes"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Ndrysho në versionin fillestar"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Hiqi të gjitha"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Rivendosja e VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Cilësimet"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminali po ekzekutohet"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Kliko për të hapur terminalin."</string>
diff --git a/android/TerminalApp/res/values-sr/strings.xml b/android/TerminalApp/res/values-sr/strings.xml
index 6da7040..bf55906 100644
--- a/android/TerminalApp/res/values-sr/strings.xml
+++ b/android/TerminalApp/res/values-sr/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Терминал"</string>
<string name="installer_title_text" msgid="500663060973466805">"Инсталирајте Linux терминал"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Да бисте покренули Linux терминал, треба да преузмете око <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> података преко мреже.\nЖелите да наставите?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Преузми када WiFi буде доступан"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Инсталирај"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Инсталира се"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Грешка на мрежи. Проверите везу и пробајте поново."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Опције опоравка партиција"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Промените на почетну верзију"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Уклоните све"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Виртуелна машина је ресетована"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Ресетујте виртуелну машину"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Подаци ће бити избрисани."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Потврди"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Откажи"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Подешавања"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Терминал је активан"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Кликните да бисте отворили терминал."</string>
diff --git a/android/TerminalApp/res/values-sv/strings.xml b/android/TerminalApp/res/values-sv/strings.xml
index 22591e2..39f097b 100644
--- a/android/TerminalApp/res/values-sv/strings.xml
+++ b/android/TerminalApp/res/values-sv/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Installera Linux-terminalen"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Om du vill starta Linux-terminalen måste du ladda ned ungefär <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> data via nätverket.\nVill du fortsätta?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Ladda ned när wifi är tillgängligt"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Installera"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Installerar"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Nätverksfel. Kontrollera anslutningen och försök igen."</string>
@@ -49,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Återställningsalternativ för partition"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Ändra till ursprunglig version"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Ta bort alla"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM-återställning"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Återställ den virtuella datorn"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Data kommer att raderas."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Bekräfta"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Avbryt"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Inställningar"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminalen körs"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Klicka för att öppna terminalen."</string>
diff --git a/android/TerminalApp/res/values-sw/strings.xml b/android/TerminalApp/res/values-sw/strings.xml
index c3d124f..e97c3ae 100644
--- a/android/TerminalApp/res/values-sw/strings.xml
+++ b/android/TerminalApp/res/values-sw/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Temino"</string>
<string name="installer_title_text" msgid="500663060973466805">"Weka kituo cha Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Unahitaji kupakua takribani <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ya data kwenye mtandao ili uwashe kituo cha Linux.\nUngependa kuendelea?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Pakua wakati Wi-Fi inapatikana"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Weka"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Inaweka"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Hitilafu ya mtandao. Angalia muunganisho kisha ujaribu tena."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Chaguo za kurejesha data ya sehemu"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Rudi kwenye Toleo la awali"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Ondoa yote"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Imeweka upya mipangilio ya mtambo pepe"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Mipangilio"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Kituo kinatumika"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Bofya ili ufungue kituo."</string>
diff --git a/android/TerminalApp/res/values-ta/strings.xml b/android/TerminalApp/res/values-ta/strings.xml
index 791d3dd..77bbfa1 100644
--- a/android/TerminalApp/res/values-ta/strings.xml
+++ b/android/TerminalApp/res/values-ta/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"டெர்மினல்"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux டெர்மினலை நிறுவுதல்"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux டெர்மினலைத் தொடங்க, நெட்வொர்க் மூலம் நீங்கள் சுமார் <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> தரவைப் பதிவிறக்க வேண்டும்.\nதொடர விரும்புகிறீர்களா?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"வைஃபை கிடைக்கும்போது பதிவிறக்கு"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"நிறுவு"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"நிறுவுகிறது"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"நெட்வொர்க் பிழை. இணைப்பைச் சரிபார்த்து மீண்டும் முயலவும்."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"பார்டிஷன் மீட்டெடுப்பு விருப்பங்கள்"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"முதல் பதிப்பிற்கு மாற்றுதல்"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"அனைத்தையும் அகற்றுதல்"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM மீட்டமைக்கப்பட்டது"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"அமைப்புகள்"</string>
<string name="service_notification_title" msgid="2918088850910713393">"டெர்மினல் இயக்கத்தில் உள்ளது"</string>
<string name="service_notification_content" msgid="8652887364784704911">"டெர்மினலைத் திறக்க கிளிக் செய்யுங்கள்."</string>
diff --git a/android/TerminalApp/res/values-te/strings.xml b/android/TerminalApp/res/values-te/strings.xml
index 1972ab9..472712a 100644
--- a/android/TerminalApp/res/values-te/strings.xml
+++ b/android/TerminalApp/res/values-te/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"టెర్మినల్"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux టెర్మినల్ను ఇన్స్టాల్ చేయండి"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux టెర్మినల్ను ప్రారంభించడానికి, మీరు నెట్వర్క్ ద్వారా దాదాపు <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> డేటాను డౌన్లోడ్ చేసుకోవాలి.\nమీరు కొనసాగిస్తారా?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi అందుబాటులో ఉన్నప్పుడు డౌన్లోడ్ చేయండి"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ఇన్స్టాల్ చేయి"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"ఇన్స్టాల్ చేస్తోంది"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"నెట్వర్క్ ఎర్రర్. కనెక్షన్ను చెక్ చేసి, మళ్లీ ట్రై చేయండి."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"పార్టిషన్ రికవరీ ఆప్షన్లు"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"మొదటి వెర్షన్కు మార్చండి"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"అన్నీ తీసివేయండి"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM రీసెట్"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"సెట్టింగ్లు"</string>
<string name="service_notification_title" msgid="2918088850910713393">"టెర్మినల్ రన్ అవుతోంది"</string>
<string name="service_notification_content" msgid="8652887364784704911">"టెర్మినల్ను తెరవడానికి క్లిక్ చేయండి."</string>
diff --git a/android/TerminalApp/res/values-th/strings.xml b/android/TerminalApp/res/values-th/strings.xml
index 5c3fd91..f1b03f9 100644
--- a/android/TerminalApp/res/values-th/strings.xml
+++ b/android/TerminalApp/res/values-th/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"เทอร์มินัล"</string>
<string name="installer_title_text" msgid="500663060973466805">"ติดตั้งเทอร์มินัล Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"หากต้องการเปิดเทอร์มินัล Linux คุณจะต้องดาวน์โหลดข้อมูลประมาณ <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ผ่านเครือข่าย\nคุณต้องการดำเนินการต่อไหม"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"ดาวน์โหลดเมื่อมีการเชื่อมต่อ Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"ติดตั้ง"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"กำลังติดตั้ง"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"ข้อผิดพลาดเกี่ยวกับเครือข่าย ตรวจสอบการเชื่อมต่อแล้วลองอีกครั้ง"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"ตัวเลือกการกู้คืนพาร์ติชัน"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"เปลี่ยนเป็นเวอร์ชันเริ่มต้น"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"นำออกทั้งหมด"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"รีเซ็ต VM แล้ว"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"การตั้งค่า"</string>
<string name="service_notification_title" msgid="2918088850910713393">"เทอร์มินัลกำลังทำงาน"</string>
<string name="service_notification_content" msgid="8652887364784704911">"คลิกเพื่อเปิดเทอร์มินัล"</string>
diff --git a/android/TerminalApp/res/values-tl/strings.xml b/android/TerminalApp/res/values-tl/strings.xml
index 5a73821..0b69225 100644
--- a/android/TerminalApp/res/values-tl/strings.xml
+++ b/android/TerminalApp/res/values-tl/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"I-install ang terminal ng Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Para ilunsad ang terminal ng Linux, kailangan mong mag-download ng humigit-kumulang <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> na data sa network.\nGusto mo bang magpatuloy?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"I-download kapag available ang Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"I-install"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Ini-install"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Error sa network. Tingnan ang koneksyon at subukan ulit."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Mga opsyon sa Pag-recover ng Partition"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Baguhin sa inisyal na bersyon"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Alisin lahat"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Na-reset na ang VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Mga Setting"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Gumagana ang terminal"</string>
<string name="service_notification_content" msgid="8652887364784704911">"I-click para buksan ang terminal."</string>
diff --git a/android/TerminalApp/res/values-tr/strings.xml b/android/TerminalApp/res/values-tr/strings.xml
index 0f21631..cfa847f 100644
--- a/android/TerminalApp/res/values-tr/strings.xml
+++ b/android/TerminalApp/res/values-tr/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Linux terminalini yükleyin"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Linux terminalini başlatmak için ağ üzerinden yaklaşık <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> veri indirmeniz gerekir.\nDevam etmek istiyor musunuz?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Kablosuz bağlantı olduğunda indir"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Yükle"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Yükleniyor"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Ağ hatası. Bağlantıyı kontrol edip tekrar deneyin."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Bölüm kurtarma seçenekleri"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"İlk sürüme geç"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Tümünü kaldır"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Sanal makine sıfırlandı"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Ayarlar"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal çalışıyor"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Terminali açmak için tıklayın."</string>
diff --git a/android/TerminalApp/res/values-uk/strings.xml b/android/TerminalApp/res/values-uk/strings.xml
index 1ce7ba7..c0459e6 100644
--- a/android/TerminalApp/res/values-uk/strings.xml
+++ b/android/TerminalApp/res/values-uk/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Термінал"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Установити термінал Linux"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Щоб запустити термінал Linux, потрібно завантажити приблизно <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> даних через мережу.\nПродовжити?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Завантажити через Wi-Fi, коли буде доступно"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Установити"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Встановлення"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Помилка мережі. Перевірте з’єднання й повторіть спробу."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Встановлення термінала Linux"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Після завершення буде запущено термінал Linux"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Не вдалося встановити через проблему з мережею"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Не вдалося встановити. Повторіть спробу."</string>
<string name="action_settings" msgid="5729342767795123227">"Налаштування"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Підготовка термінала"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Зупинка термінала"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Способи відновлення розділів"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Зміна на початкову версію"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Видалити всі"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Налаштування віртуальної машини скинуто"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Налаштування"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Термінал запущено"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Натисніть, щоб відкрити термінал."</string>
diff --git a/android/TerminalApp/res/values-ur/strings.xml b/android/TerminalApp/res/values-ur/strings.xml
index acfd740..e3b75a7 100644
--- a/android/TerminalApp/res/values-ur/strings.xml
+++ b/android/TerminalApp/res/values-ur/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"ٹرمینل"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Linux ٹرمینل انسٹال کریں"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux ٹرمینل کو شروع کرنے کے لیے، آپ کو نیٹ ورک پر تقریباً <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> ڈیٹا ڈاؤن لوڈ کرنا ہوگا۔\nکیا آپ آگے بڑھیں گے؟"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi دستیاب ہونے پر ڈاؤن لوڈ کریں"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"انسٹال کریں"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"انسٹال کیا جا رہا ہے"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"نیٹ ورک کی خرابی۔ کنکشن چیک کریں اور دوبارہ کوشش کریں۔"</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux ٹرمینل انسٹال ہو رہا ہے"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"مکمل ہونے کے بعد Linux ٹرمینل شروع کیا جا سکے گا"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"نیٹ ورک میں خرابی کی وجہ سے انسٹال نہیں کیا جا سکا"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"انسٹال نہیں کیا جا سکا۔ دوبارہ کوشش کریں۔"</string>
<string name="action_settings" msgid="5729342767795123227">"ترتیبات"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"ٹرمینل تیار ہو رہا ہے"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"ٹرمینل کو روکا جا رہا ہے"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"پارٹیشن کی بازیابی کے اختیارات"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"ابتدائی ورژن میں تبدیلی"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"سبھی ہٹائیں"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM ری سیٹ ہو گیا"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"ترتیبات"</string>
<string name="service_notification_title" msgid="2918088850910713393">"ٹرمینل چل رہا ہے"</string>
<string name="service_notification_content" msgid="8652887364784704911">"ٹرمینل کھولنے کے لیے کلک کریں۔"</string>
diff --git a/android/TerminalApp/res/values-uz/strings.xml b/android/TerminalApp/res/values-uz/strings.xml
index acef146..cf261dd 100644
--- a/android/TerminalApp/res/values-uz/strings.xml
+++ b/android/TerminalApp/res/values-uz/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Linux terminalini oʻrnatish"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Linux terminalini ishga tushirish uchun tarmo orqali taxminan <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> axborot yuklab olish kerak.\nDavom etilsinmi?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Wi-Fi tarmoqqa ulanganda yuklab olish"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Oʻrnatish"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Oʻrnatilmoqda"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Tarmoq xatosi. Aloqani tekshirib, qayta urining."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Linux terminali oʻrnatilmoqda"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Linux terminali oʻrnatilganidan keyin ishga tushadi"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Tarmoq xatosi sababli oʻrnatilmadi"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Oʻrnatilmadi. Qayta urining."</string>
<string name="action_settings" msgid="5729342767795123227">"Sozlamalar"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Terminal tayyorlanmoqda"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Terminal toʻxtatilmoqda"</string>
@@ -58,7 +48,10 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Disk boʻlimini tiklash opsiyalari"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Dastlabki versiyaga oʻzgartirish"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Hammasini tozalash"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM tozalandi"</string>
+ <string name="settings_recovery_reset_dialog_title" msgid="2695282831393218812">"Virutal mashinani asliga qaytarish"</string>
+ <string name="settings_recovery_reset_dialog_message" msgid="3126236636568914757">"Maʼlumotlar oʻchib ketadi."</string>
+ <string name="settings_recovery_reset_dialog_confirm" msgid="431718610013947861">"Tasdiqlash"</string>
+ <string name="settings_recovery_reset_dialog_cancel" msgid="1666264288208459725">"Bekor qilish"</string>
<string name="service_notification_settings" msgid="1437365721184401135">"Sozlamalar"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal ishga tushgan"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Terminalni ochish uchun bosing."</string>
diff --git a/android/TerminalApp/res/values-vi/strings.xml b/android/TerminalApp/res/values-vi/strings.xml
index b1443e6..69e85ed 100644
--- a/android/TerminalApp/res/values-vi/strings.xml
+++ b/android/TerminalApp/res/values-vi/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"Terminal"</string>
<string name="installer_title_text" msgid="500663060973466805">"Cài đặt thiết bị đầu cuối Linux"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"Để khởi chạy thiết bị đầu cuối Linux, bạn cần tải khoảng <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> dữ liệu xuống qua mạng.\nBạn có muốn tiếp tục không?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Tải xuống khi có Wi-Fi"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Cài đặt"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Đang cài đặt"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"Lỗi mạng. Hãy kiểm tra trạng thái kết nối rồi thử lại."</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Tuỳ chọn khôi phục phân vùng"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Thay đổi thành phiên bản ban đầu"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Xoá tất cả"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Đã đặt lại máy ảo"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Cài đặt"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Terminal đang chạy"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Nhấp để mở Terminal."</string>
diff --git a/android/TerminalApp/res/values-zh-rCN/strings.xml b/android/TerminalApp/res/values-zh-rCN/strings.xml
index 43b5338..2b78ec3 100644
--- a/android/TerminalApp/res/values-zh-rCN/strings.xml
+++ b/android/TerminalApp/res/values-zh-rCN/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"终端"</string>
<string name="installer_title_text" msgid="500663060973466805">"安装 Linux 终端"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"如需启动 Linux 终端,您需要联网下载大约 <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> 的数据。\n要继续吗?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"连接到 WLAN 时下载"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"安装"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"正在安装"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"网络错误。请检查网络连接,然后重试。"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"分区恢复选项"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"更改为初始版本"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"全部移除"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"已重置虚拟机"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"设置"</string>
<string name="service_notification_title" msgid="2918088850910713393">"终端正在运行"</string>
<string name="service_notification_content" msgid="8652887364784704911">"点击即可打开终端。"</string>
diff --git a/android/TerminalApp/res/values-zh-rHK/strings.xml b/android/TerminalApp/res/values-zh-rHK/strings.xml
index 2a2bdc9..eb4f823 100644
--- a/android/TerminalApp/res/values-zh-rHK/strings.xml
+++ b/android/TerminalApp/res/values-zh-rHK/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"終端機"</string>
<string name="installer_title_text" msgid="500663060973466805">"安裝 Linux 終端機"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"如要啟動 Linux 終端機,你需要透過網絡下載約 <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> 資料。\n要繼續嗎?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"連接 Wi-Fi 時下載"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"安裝"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"正在安裝"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"網絡錯誤。請檢查網絡連線,然後重試。"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"分區復原選項"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"變更至初始版本"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"全部移除"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"重設虛擬機器"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"設定"</string>
<string name="service_notification_title" msgid="2918088850910713393">"終端機執行中"</string>
<string name="service_notification_content" msgid="8652887364784704911">"按一下即可開啟終端機。"</string>
diff --git a/android/TerminalApp/res/values-zh-rTW/strings.xml b/android/TerminalApp/res/values-zh-rTW/strings.xml
index ebe33a4..3049611 100644
--- a/android/TerminalApp/res/values-zh-rTW/strings.xml
+++ b/android/TerminalApp/res/values-zh-rTW/strings.xml
@@ -19,8 +19,7 @@
<string name="app_name" msgid="5597111707986572208">"終端機"</string>
<string name="installer_title_text" msgid="500663060973466805">"安裝 Linux 終端機"</string>
<string name="installer_desc_text_format" msgid="2734224805682171826">"如要啟動 Linux 終端機,必須透過網路下載大約 <xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> 的資料。\n要繼續嗎?"</string>
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"連上 Wi-Fi 網路時下載"</string>
<string name="installer_install_button_enabled_text" msgid="6142090640081511103">"安裝"</string>
<string name="installer_install_button_disabled_text" msgid="8651445004125422467">"安裝中"</string>
<string name="installer_install_network_error_message" msgid="2450409107529774410">"網路發生錯誤。請檢查連線狀況,然後再試一次。"</string>
@@ -49,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"分區復原選項"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"變更為初始版本"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"全部移除"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"VM 已重設"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"設定"</string>
<string name="service_notification_title" msgid="2918088850910713393">"終端機運作中"</string>
<string name="service_notification_content" msgid="8652887364784704911">"點選即可開啟終端機。"</string>
diff --git a/android/TerminalApp/res/values-zu/strings.xml b/android/TerminalApp/res/values-zu/strings.xml
index da8907b..561051f 100644
--- a/android/TerminalApp/res/values-zu/strings.xml
+++ b/android/TerminalApp/res/values-zu/strings.xml
@@ -17,26 +17,16 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="5597111707986572208">"Itheminali"</string>
- <!-- no translation found for installer_title_text (500663060973466805) -->
- <skip />
- <!-- no translation found for installer_desc_text_format (2734224805682171826) -->
- <skip />
- <!-- no translation found for installer_wait_for_wifi_checkbox_text (487720664098014506) -->
- <skip />
- <!-- no translation found for installer_install_button_enabled_text (6142090640081511103) -->
- <skip />
- <!-- no translation found for installer_install_button_disabled_text (8651445004125422467) -->
- <skip />
- <!-- no translation found for installer_install_network_error_message (2450409107529774410) -->
- <skip />
- <!-- no translation found for installer_notif_title_text (471160690081159042) -->
- <skip />
- <!-- no translation found for installer_notif_desc_text (6746098106305899060) -->
- <skip />
- <!-- no translation found for installer_error_network (3265100678310833813) -->
- <skip />
- <!-- no translation found for installer_error_unknown (1991780204241177455) -->
- <skip />
+ <string name="installer_title_text" msgid="500663060973466805">"Faka itheminali yeLinux"</string>
+ <string name="installer_desc_text_format" msgid="2734224805682171826">"Ukuze uqalise itheminali yeLinux, udinga ukudawuniloda cishe idatha u-<xliff:g id="EXPECTED_SIZE">%1$s</xliff:g> kunethiwekhi.\nUngathanda ukuqhubeka?"</string>
+ <string name="installer_wait_for_wifi_checkbox_text" msgid="487720664098014506">"Dawuniloda lapho i-Wi-Fi itholakala"</string>
+ <string name="installer_install_button_enabled_text" msgid="6142090640081511103">"Faka"</string>
+ <string name="installer_install_button_disabled_text" msgid="8651445004125422467">"Iyafaka"</string>
+ <string name="installer_install_network_error_message" msgid="2450409107529774410">"Iphutha lenethiwekhi. Hlola uxhumo bese uyazama futhi."</string>
+ <string name="installer_notif_title_text" msgid="471160690081159042">"Ifaka itheminali yeLinux"</string>
+ <string name="installer_notif_desc_text" msgid="6746098106305899060">"Itheminali yeLinux izoqalwa ngemva kokuqeda"</string>
+ <string name="installer_error_network" msgid="3265100678310833813">"Yehlulekile ukufaka ngenxa yenkinga yenethiwekhi"</string>
+ <string name="installer_error_unknown" msgid="1991780204241177455">"Yehlulekile ukufaka. Zama futhi."</string>
<string name="action_settings" msgid="5729342767795123227">"Amasethingi"</string>
<string name="vm_creation_message" msgid="6594953532721367502">"Ilungiselela itheminali"</string>
<string name="vm_stop_message" msgid="3978349856095529255">"Itheminali yokumisa"</string>
@@ -58,7 +48,14 @@
<string name="settings_recovery_sub_title" msgid="1067782421529340576">"Okukhethwa kukho kokubuyisela ukwahlukanisa"</string>
<string name="settings_recovery_reset_title" msgid="8785305518694186025">"Shintshela Ohlotsheni lokuqala"</string>
<string name="settings_recovery_reset_sub_title" msgid="5656572074090728544">"Susa konke"</string>
- <string name="settings_recovery_reset_message" msgid="3450358289168768830">"Ukusetha kabusha i-VM"</string>
+ <!-- no translation found for settings_recovery_reset_dialog_title (2695282831393218812) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_message (3126236636568914757) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_confirm (431718610013947861) -->
+ <skip />
+ <!-- no translation found for settings_recovery_reset_dialog_cancel (1666264288208459725) -->
+ <skip />
<string name="service_notification_settings" msgid="1437365721184401135">"Amasethingi"</string>
<string name="service_notification_title" msgid="2918088850910713393">"Itheminali iyasebenza"</string>
<string name="service_notification_content" msgid="8652887364784704911">"Chofoza ukuze uvule itheminali."</string>
diff --git a/android/forwarder_host/src/forwarder_host.rs b/android/forwarder_host/src/forwarder_host.rs
index 78f3555..26bae89 100644
--- a/android/forwarder_host/src/forwarder_host.rs
+++ b/android/forwarder_host/src/forwarder_host.rs
@@ -24,7 +24,7 @@
use std::net::{Ipv4Addr, Ipv6Addr, TcpListener};
use std::os::unix::io::AsRawFd;
use std::result;
-use std::sync::{Arc, Mutex};
+use std::sync::{Arc, LazyLock, Mutex};
use std::time::Duration;
use forwarder::forwarder::ForwarderSession;
@@ -42,6 +42,9 @@
const VMADDR_PORT_ANY: u32 = u32::MAX;
+static SHUTDOWN_EVT: LazyLock<EventFd> =
+ LazyLock::new(|| EventFd::new().expect("Could not create shutdown eventfd"));
+
#[remain::sorted]
#[derive(Debug)]
enum Error {
@@ -111,6 +114,7 @@
/// Implements PollToken for chunneld's main poll loop.
#[derive(Clone, Copy, PollToken)]
enum Token {
+ Shutdown,
UpdatePorts,
Ipv4Listener(u16),
Ipv6Listener(u16),
@@ -290,12 +294,16 @@
fn run(&mut self) -> Result<()> {
let poll_ctx: PollContext<Token> = PollContext::new().map_err(Error::PollContextNew)?;
poll_ctx.add(&self.update_evt, Token::UpdatePorts).map_err(Error::PollContextAdd)?;
+ poll_ctx.add(&*SHUTDOWN_EVT, Token::Shutdown).map_err(Error::PollContextAdd)?;
loop {
let events = poll_ctx.wait().map_err(Error::PollWait)?;
for event in events.iter_readable() {
match event.token() {
+ Token::Shutdown => {
+ return Ok(());
+ }
Token::UpdatePorts => {
if let Err(e) = self.process_update_queue(&poll_ctx) {
error!("error updating listening ports: {}", e);
@@ -425,3 +433,12 @@
}
}
}
+
+/// JNI function for terminating forwarder_host.
+#[no_mangle]
+pub extern "C" fn Java_com_android_virtualization_vmlauncher_DebianServiceImpl_terminateForwarderHost(
+ _env: JNIEnv,
+ _class: JObject,
+) {
+ SHUTDOWN_EVT.write(1).expect("Failed to write shutdown event FD");
+}
diff --git a/android/virtmgr/src/aidl.rs b/android/virtmgr/src/aidl.rs
index 87d7a88..e2b2804 100644
--- a/android/virtmgr/src/aidl.rs
+++ b/android/virtmgr/src/aidl.rs
@@ -59,7 +59,7 @@
Key::Key, PubKey::PubKey, SessionIdSignature::SessionIdSignature, SessionInfo::SessionInfo,
SessionInitiationInfo::SessionInitiationInfo,
};
-use anyhow::{anyhow, bail, Context, Result};
+use anyhow::{anyhow, bail, ensure, Context, Result};
use apkverify::{HashAlgorithm, V4Signature};
use avflog::LogResult;
use binder::{
@@ -76,7 +76,7 @@
use rustutils::system_properties;
use semver::VersionReq;
use serde::Deserialize;
-use std::collections::HashSet;
+use std::collections::{HashSet, HashMap};
use std::convert::TryInto;
use std::fs;
use std::ffi::CStr;
@@ -2007,22 +2007,21 @@
}
// KEEP IN SYNC WITH early_vms.xsd
-#[derive(Debug, Deserialize, PartialEq)]
+#[derive(Clone, Debug, Deserialize, PartialEq)]
struct EarlyVm {
- #[allow(dead_code)]
name: String,
- #[allow(dead_code)]
cid: i32,
- #[allow(dead_code)]
path: String,
}
#[derive(Debug, Default, Deserialize)]
struct EarlyVms {
- #[allow(dead_code)]
early_vm: Vec<EarlyVm>,
}
+static EARLY_VMS_CACHE: LazyLock<Mutex<HashMap<String, Vec<EarlyVm>>>> =
+ LazyLock::new(|| Mutex::new(HashMap::new()));
+
fn range_for_partition(partition: &str) -> Result<Range<Cid>> {
match partition {
"system" => Ok(100..200),
@@ -2031,7 +2030,7 @@
}
}
-fn find_early_vm(xml_path: &Path, cid_range: &Range<Cid>, name: &str) -> Result<EarlyVm> {
+fn get_early_vms_in_path(xml_path: &Path) -> Result<Vec<EarlyVm>> {
if !xml_path.exists() {
bail!("{} doesn't exist", xml_path.display());
}
@@ -2043,35 +2042,74 @@
let early_vms: EarlyVms = serde_xml_rs::from_str(&xml)
.with_context(|| format!("Can't parse {}", xml_path.display()))?;
- let mut found_vm: Option<EarlyVm> = None;
+ Ok(early_vms.early_vm)
+}
- for early_vm in early_vms.early_vm {
+fn validate_cid_range(early_vms: &[EarlyVm], cid_range: &Range<Cid>) -> Result<()> {
+ for early_vm in early_vms {
+ let cid = early_vm
+ .cid
+ .try_into()
+ .with_context(|| format!("VM '{}' uses Invalid CID {}", early_vm.name, early_vm.cid))?;
+
+ ensure!(
+ cid_range.contains(&cid),
+ "VM '{}' uses CID {cid} which is out of range. Available CIDs: {cid_range:?}",
+ early_vm.name
+ );
+ }
+ Ok(())
+}
+
+fn get_early_vms_in_partition(partition: &str) -> Result<Vec<EarlyVm>> {
+ let mut cache = EARLY_VMS_CACHE.lock().unwrap();
+
+ if let Some(result) = cache.get(partition) {
+ return Ok(result.clone());
+ }
+
+ let pattern = format!("/{partition}/etc/avf/early_vms*.xml");
+ let mut early_vms = Vec::new();
+ for entry in glob::glob(&pattern).with_context(|| format!("Failed to glob {}", &pattern))? {
+ match entry {
+ Ok(path) => early_vms.extend(get_early_vms_in_path(&path)?),
+ Err(e) => error!("Error while globbing (but continuing) {}: {}", &pattern, e),
+ }
+ }
+
+ validate_cid_range(&early_vms, &range_for_partition(partition)?)
+ .with_context(|| format!("CID validation for {partition} failed"))?;
+
+ cache.insert(partition.to_owned(), early_vms.clone());
+
+ Ok(early_vms)
+}
+
+fn find_early_vm<'a>(early_vms: &'a [EarlyVm], name: &str) -> Result<&'a EarlyVm> {
+ let mut found_vm: Option<&EarlyVm> = None;
+
+ for early_vm in early_vms {
if early_vm.name != name {
continue;
}
- let cid = early_vm
- .cid
- .try_into()
- .with_context(|| format!("Invalid CID value {}", early_vm.cid))?;
-
- if !cid_range.contains(&cid) {
- bail!("VM '{}' uses CID {cid} which is out of range. Available CIDs for '{}': {cid_range:?}", xml_path.display(), early_vm.name);
- }
-
if found_vm.is_some() {
- bail!("Multiple VMs named {name} are found in {}", xml_path.display());
+ bail!("Multiple VMs named '{name}' are found");
}
found_vm = Some(early_vm);
}
- found_vm.ok_or_else(|| anyhow!("Can't find {name} in {}", xml_path.display()))
+ found_vm.ok_or_else(|| anyhow!("Can't find a VM named '{name}'"))
}
fn find_early_vm_for_partition(partition: &str, name: &str) -> Result<EarlyVm> {
- let cid_range = range_for_partition(partition)?;
- find_early_vm(Path::new(&format!("/{partition}/etc/avf/early_vms.xml")), &cid_range, name)
+ let early_vms = get_early_vms_in_partition(partition)
+ .with_context(|| format!("Failed to get early VMs from {partition}"))?;
+
+ Ok(find_early_vm(&early_vms, name)
+ .with_context(|| format!("Failed to find early VM '{name}' in {partition}"))?
+ .clone())
}
#[cfg(test)]
@@ -2314,6 +2352,87 @@
<path>/system/bin/vm_demo_native_early</path>
</early_vm>
<early_vm>
+ <name>vm_demo_native_early_2</name>
+ <cid>456</cid>
+ <path>/system/bin/vm_demo_native_early_2</path>
+ </early_vm>
+ </early_vms>
+ "#,
+ )?;
+
+ let cid_range = 100..1000;
+
+ let early_vms = get_early_vms_in_path(&xml_path)?;
+ validate_cid_range(&early_vms, &cid_range)?;
+
+ let test_cases = [
+ (
+ "vm_demo_native_early",
+ EarlyVm {
+ name: "vm_demo_native_early".to_owned(),
+ cid: 123,
+ path: "/system/bin/vm_demo_native_early".to_owned(),
+ },
+ ),
+ (
+ "vm_demo_native_early_2",
+ EarlyVm {
+ name: "vm_demo_native_early_2".to_owned(),
+ cid: 456,
+ path: "/system/bin/vm_demo_native_early_2".to_owned(),
+ },
+ ),
+ ];
+
+ for (name, expected) in test_cases {
+ let result = find_early_vm(&early_vms, name)?;
+ assert_eq!(result, &expected);
+ }
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_invalid_cid_validation() -> Result<()> {
+ let tmp_dir = tempfile::TempDir::new()?;
+ let xml_path = tmp_dir.path().join("early_vms.xml");
+
+ let cid_range = 100..1000;
+
+ for cid in [-1, 999999] {
+ std::fs::write(
+ &xml_path,
+ format!(
+ r#"<?xml version="1.0" encoding="utf-8"?>
+ <early_vms>
+ <early_vm>
+ <name>vm_demo_invalid_cid</name>
+ <cid>{cid}</cid>
+ <path>/system/bin/vm_demo_invalid_cid</path>
+ </early_vm>
+ </early_vms>
+ "#
+ ),
+ )?;
+
+ let early_vms = get_early_vms_in_path(&xml_path)?;
+ assert!(validate_cid_range(&early_vms, &cid_range).is_err(), "should fail");
+ }
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_duplicated_early_vms() -> Result<()> {
+ let tmp_dir = tempfile::TempDir::new()?;
+ let tmp_dir_path = tmp_dir.path().to_owned();
+ let xml_path = tmp_dir_path.join("early_vms.xml");
+
+ std::fs::write(
+ &xml_path,
+ br#"<?xml version="1.0" encoding="utf-8"?>
+ <early_vms>
+ <early_vm>
<name>vm_demo_duplicated_name</name>
<cid>456</cid>
<path>/system/bin/vm_demo_duplicated_name_1</path>
@@ -2323,42 +2442,16 @@
<cid>789</cid>
<path>/system/bin/vm_demo_duplicated_name_2</path>
</early_vm>
- <early_vm>
- <name>vm_demo_invalid_cid_1</name>
- <cid>-1</cid>
- <path>/system/bin/vm_demo_invalid_cid_1</path>
- </early_vm>
- <early_vm>
- <name>vm_demo_invalid_cid_2</name>
- <cid>999999</cid>
- <path>/system/bin/vm_demo_invalid_cid_2</path>
- </early_vm>
</early_vms>
"#,
)?;
let cid_range = 100..1000;
- let result = find_early_vm(&xml_path, &cid_range, "vm_demo_native_early")?;
- let expected = EarlyVm {
- name: "vm_demo_native_early".to_owned(),
- cid: 123,
- path: "/system/bin/vm_demo_native_early".to_owned(),
- };
- assert_eq!(result, expected);
+ let early_vms = get_early_vms_in_path(&xml_path)?;
+ validate_cid_range(&early_vms, &cid_range)?;
- assert!(
- find_early_vm(&xml_path, &cid_range, "vm_demo_duplicated_name").is_err(),
- "should fail"
- );
- assert!(
- find_early_vm(&xml_path, &cid_range, "vm_demo_invalid_cid_1").is_err(),
- "should fail"
- );
- assert!(
- find_early_vm(&xml_path, &cid_range, "vm_demo_invalid_cid_2").is_err(),
- "should fail"
- );
+ assert!(find_early_vm(&early_vms, "vm_demo_duplicated_name").is_err(), "should fail");
Ok(())
}
diff --git a/build/debian/build.sh b/build/debian/build.sh
index b4436c1..7fc9035 100755
--- a/build/debian/build.sh
+++ b/build/debian/build.sh
@@ -169,6 +169,19 @@
mv "${debian_cloud_image}/image_bookworm_nocloud_${debian_arch}.raw" "${out}"
}
+extract_partitions() {
+ root_partition_num=1
+ efi_partition_num=15
+
+ loop=$(losetup -f --show --partscan image.raw)
+ dd if=${loop}p$root_partition_num of=root_part
+ dd if=${loop}p$efi_partition_num of=efi_part
+ losetup -d ${loop}
+
+ sed -i "s/{root_part_guid}/$(sfdisk --part-uuid image.raw $root_partition_num)/g" vm_config.json
+ sed -i "s/{efi_part_guid}/$(sfdisk --part-uuid image.raw $efi_partition_num)/g" vm_config.json
+}
+
clean_up() {
rm -rf "${workdir}"
}
@@ -191,18 +204,29 @@
copy_android_config
run_fai
fdisk -l image.raw
-images=(image.raw)
+images=()
+
+cp $(dirname $0)/vm_config.json.${arch} vm_config.json
+
+if [[ "$arch" == "aarch64" ]]; then
+ extract_partitions
+ images+=(
+ root_part
+ efi_part
+ )
+fi
+
# TODO(b/365955006): remove these lines when uboot supports x86_64 EFI application
if [[ "$arch" == "x86_64" ]]; then
virt-get-kernel -a image.raw
mv vmlinuz* vmlinuz
mv initrd.img* initrd.img
images+=(
+ image.raw
vmlinuz
initrd.img
)
fi
-cp $(dirname $0)/vm_config.json.${arch} vm_config.json
# --sparse option isn't supported in apache-commons-compress
-tar czv -f images.tar.gz ${images[@]} vm_config.json
\ No newline at end of file
+tar czv -f images.tar.gz ${images[@]} vm_config.json
diff --git a/build/debian/vm_config.json.aarch64 b/build/debian/vm_config.json.aarch64
index 2df0a05..bbe590f 100644
--- a/build/debian/vm_config.json.aarch64
+++ b/build/debian/vm_config.json.aarch64
@@ -2,8 +2,20 @@
"name": "debian",
"disks": [
{
- "image": "$PAYLOAD_DIR/image.raw",
- "partitions": [],
+ "partitions": [
+ {
+ "label": "ROOT",
+ "path": "$PAYLOAD_DIR/root_part",
+ "writable": true,
+ "guid": "{root_part_guid}"
+ },
+ {
+ "label": "EFI",
+ "path": "$PAYLOAD_DIR/efi_part",
+ "writable": false,
+ "guid": "{efi_part_guid}"
+ }
+ ],
"writable": true
}
],
diff --git a/docs/early_vm.md b/docs/early_vm.md
index 44b71ff..3f21f11 100644
--- a/docs/early_vm.md
+++ b/docs/early_vm.md
@@ -8,8 +8,9 @@
To run an early VM, clients must follow these steps.
-1) Early VMs need to be defined in `{partition}/etc/avf/early_vms.xml`. The
-schema for this file is defined in [`early_vms.xsd`](../android/virtmgr/early_vms.xsd).
+1) Early VMs must be defined in XML files located at
+`{partition}/etc/avf/early_vms*.xml`. Schema for these files is defined in
+[`early_vms.xsd`](../android/virtmgr/early_vms.xsd).
```early_vms.xml
<early_vms>
@@ -25,6 +26,9 @@
connection with `early_virtmgr` and create a VM named `vm_demo_native_early`,
which will be assigned the static CID 123.
+Multiple XML files matching the glob pattern
+`{partition}/etc/avf/early_vms*.xml` can be used to define early VMs.
+
2) The client must have the following three or four capabilities.
* `IPC_LOCK`
diff --git a/guest/pvmfw/Android.bp b/guest/pvmfw/Android.bp
index 4586cca..a5b7494 100644
--- a/guest/pvmfw/Android.bp
+++ b/guest/pvmfw/Android.bp
@@ -16,6 +16,7 @@
"libcbor_util_nostd",
"libciborium_nostd",
"libciborium_io_nostd",
+ "libcoset_nostd",
"libcstr",
"libdiced_open_dice_nostd",
"liblibfdt_nostd",
diff --git a/guest/pvmfw/src/bcc.rs b/guest/pvmfw/src/bcc.rs
index 5317ce9..9260d7f 100644
--- a/guest/pvmfw/src/bcc.rs
+++ b/guest/pvmfw/src/bcc.rs
@@ -21,6 +21,7 @@
use ciborium::value::Value;
use core::fmt;
use core::mem::size_of;
+use coset::{iana, Algorithm, CborSerializable, CoseKey};
use diced_open_dice::{BccHandover, Cdi, DiceArtifacts, DiceMode};
use log::trace;
@@ -29,16 +30,24 @@
pub enum BccError {
CborDecodeError,
CborEncodeError,
+ CosetError(coset::CoseError),
DiceError(diced_open_dice::DiceError),
MalformedBcc(&'static str),
MissingBcc,
}
+impl From<coset::CoseError> for BccError {
+ fn from(e: coset::CoseError) -> Self {
+ Self::CosetError(e)
+ }
+}
+
impl fmt::Display for BccError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::CborDecodeError => write!(f, "Error parsing BCC CBOR"),
Self::CborEncodeError => write!(f, "Error encoding BCC CBOR"),
+ Self::CosetError(e) => write!(f, "Encountered an error with coset: {e}"),
Self::DiceError(e) => write!(f, "Dice error: {e:?}"),
Self::MalformedBcc(s) => {
write!(f, "BCC does not have the expected CBOR structure: {s}")
@@ -84,6 +93,7 @@
/// Represents a (partially) decoded BCC DICE chain.
pub struct Bcc {
is_debug_mode: bool,
+ leaf_subject_pubkey: PublicKey,
}
impl Bcc {
@@ -117,12 +127,18 @@
.collect::<Result<Vec<_>>>()?;
let is_debug_mode = is_any_payload_debug_mode(&payloads)?;
- Ok(Self { is_debug_mode })
+ // Safe to unwrap because we checked the length above.
+ let leaf_subject_pubkey = payloads.last().unwrap().subject_public_key()?;
+ Ok(Self { is_debug_mode, leaf_subject_pubkey })
}
pub fn is_debug_mode(&self) -> bool {
self.is_debug_mode
}
+
+ pub fn leaf_subject_pubkey(&self) -> &PublicKey {
+ &self.leaf_subject_pubkey
+ }
}
fn is_any_payload_debug_mode(payloads: &[BccPayload]) -> Result<bool> {
@@ -144,6 +160,13 @@
#[repr(transparent)]
struct BccPayload(Value);
+#[derive(Debug, Clone)]
+pub struct PublicKey {
+ /// The COSE key algorithm for the public key, representing the value of the `alg`
+ /// field in the COSE key format of the public key. See RFC 8152, section 7 for details.
+ pub cose_alg: iana::Algorithm,
+}
+
impl BccEntry {
pub fn new(entry: Value) -> Self {
Self(entry)
@@ -178,6 +201,7 @@
const KEY_MODE: i32 = -4670551;
const MODE_DEBUG: u8 = DiceMode::kDiceModeDebug as u8;
+const SUBJECT_PUBLIC_KEY: i32 = -4670552;
impl BccPayload {
pub fn is_debug_mode(&self) -> Result<bool> {
@@ -204,6 +228,21 @@
Ok(mode == MODE_DEBUG.into())
}
+ fn subject_public_key(&self) -> Result<PublicKey> {
+ // BccPayload = { ; CWT [RFC8392]
+ // ...
+ // -4670552 : bstr .cbor PubKeyEd25519 /
+ // bstr .cbor PubKeyECDSA256 /
+ // bstr .cbor PubKeyECDSA384, ; Subject Public Key
+ // ...
+ // }
+ self.value_from_key(SUBJECT_PUBLIC_KEY)
+ .ok_or(BccError::MalformedBcc("Subject public key missing"))?
+ .as_bytes()
+ .ok_or(BccError::MalformedBcc("Subject public key is not a byte string"))
+ .and_then(|v| PublicKey::from_slice(v))
+ }
+
fn value_from_key(&self, key: i32) -> Option<&Value> {
// BccPayload is just a map; we only use integral keys, but in general it's legitimate
// for other things to be present, or for the key we care about not to be present.
@@ -218,3 +257,13 @@
None
}
}
+
+impl PublicKey {
+ fn from_slice(slice: &[u8]) -> Result<Self> {
+ let key = CoseKey::from_slice(slice)?;
+ let Some(Algorithm::Assigned(cose_alg)) = key.alg else {
+ return Err(BccError::MalformedBcc("Invalid algorithm in public key"));
+ };
+ Ok(Self { cose_alg })
+ }
+}
diff --git a/guest/pvmfw/src/entry.rs b/guest/pvmfw/src/entry.rs
index 945ad6a..64a03cc 100644
--- a/guest/pvmfw/src/entry.rs
+++ b/guest/pvmfw/src/entry.rs
@@ -15,25 +15,23 @@
//! Low-level entry and exit points of pvmfw.
use crate::config;
-use crate::fdt;
use crate::memory;
use core::arch::asm;
use core::mem::{drop, size_of};
-use core::num::NonZeroUsize;
use core::ops::Range;
use core::slice;
-use log::debug;
use log::error;
use log::info;
use log::warn;
use log::LevelFilter;
use vmbase::util::RangeExt as _;
use vmbase::{
+ arch::aarch64::min_dcache_line_size,
configure_heap, console_writeln,
- hyp::{get_mem_sharer, get_mmio_guard},
+ hyp::get_mmio_guard,
layout::{self, crosvm, UART_PAGE_ADDR},
main,
- memory::{min_dcache_line_size, MemoryTracker, MEMORY, SIZE_128KB, SIZE_4KB},
+ memory::{MemoryTracker, MEMORY, SIZE_128KB, SIZE_4KB},
power::reboot,
};
use zeroize::Zeroize;
@@ -94,112 +92,6 @@
// if we reach this point and return, vmbase::entry::rust_entry() will call power::shutdown().
}
-struct MemorySlices<'a> {
- fdt: &'a mut libfdt::Fdt,
- kernel: &'a [u8],
- ramdisk: Option<&'a [u8]>,
-}
-
-impl<'a> MemorySlices<'a> {
- fn new(
- fdt: usize,
- kernel: usize,
- kernel_size: usize,
- vm_dtbo: Option<&mut [u8]>,
- vm_ref_dt: Option<&[u8]>,
- ) -> Result<Self, RebootReason> {
- let fdt_size = NonZeroUsize::new(crosvm::FDT_MAX_SIZE).unwrap();
- // TODO - Only map the FDT as read-only, until we modify it right before jump_to_payload()
- // e.g. by generating a DTBO for a template DT in main() and, on return, re-map DT as RW,
- // overwrite with the template DT and apply the DTBO.
- let range = MEMORY.lock().as_mut().unwrap().alloc_mut(fdt, fdt_size).map_err(|e| {
- error!("Failed to allocate the FDT range: {e}");
- RebootReason::InternalError
- })?;
-
- // SAFETY: The tracker validated the range to be in main memory, mapped, and not overlap.
- let fdt = unsafe { slice::from_raw_parts_mut(range.start as *mut u8, range.len()) };
-
- let info = fdt::sanitize_device_tree(fdt, vm_dtbo, vm_ref_dt)?;
- let fdt = libfdt::Fdt::from_mut_slice(fdt).map_err(|e| {
- error!("Failed to load sanitized FDT: {e}");
- RebootReason::InvalidFdt
- })?;
- debug!("Fdt passed validation!");
-
- let memory_range = info.memory_range;
- debug!("Resizing MemoryTracker to range {memory_range:#x?}");
- MEMORY.lock().as_mut().unwrap().shrink(&memory_range).map_err(|e| {
- error!("Failed to use memory range value from DT: {memory_range:#x?}: {e}");
- RebootReason::InvalidFdt
- })?;
-
- if let Some(mem_sharer) = get_mem_sharer() {
- let granule = mem_sharer.granule().map_err(|e| {
- error!("Failed to get memory protection granule: {e}");
- RebootReason::InternalError
- })?;
- MEMORY.lock().as_mut().unwrap().init_dynamic_shared_pool(granule).map_err(|e| {
- error!("Failed to initialize dynamically shared pool: {e}");
- RebootReason::InternalError
- })?;
- } else {
- let range = info.swiotlb_info.fixed_range().ok_or_else(|| {
- error!("Pre-shared pool range not specified in swiotlb node");
- RebootReason::InvalidFdt
- })?;
-
- MEMORY.lock().as_mut().unwrap().init_static_shared_pool(range).map_err(|e| {
- error!("Failed to initialize pre-shared pool {e}");
- RebootReason::InvalidFdt
- })?;
- }
-
- let kernel_range = if let Some(r) = info.kernel_range {
- MEMORY.lock().as_mut().unwrap().alloc_range(&r).map_err(|e| {
- error!("Failed to obtain the kernel range with DT range: {e}");
- RebootReason::InternalError
- })?
- } else if cfg!(feature = "legacy") {
- warn!("Failed to find the kernel range in the DT; falling back to legacy ABI");
-
- let kernel_size = NonZeroUsize::new(kernel_size).ok_or_else(|| {
- error!("Invalid kernel size: {kernel_size:#x}");
- RebootReason::InvalidPayload
- })?;
-
- MEMORY.lock().as_mut().unwrap().alloc(kernel, kernel_size).map_err(|e| {
- error!("Failed to obtain the kernel range with legacy range: {e}");
- RebootReason::InternalError
- })?
- } else {
- error!("Failed to locate the kernel from the DT");
- return Err(RebootReason::InvalidPayload);
- };
-
- let kernel = kernel_range.start as *const u8;
- // SAFETY: The tracker validated the range to be in main memory, mapped, and not overlap.
- let kernel = unsafe { slice::from_raw_parts(kernel, kernel_range.len()) };
-
- let ramdisk = if let Some(r) = info.initrd_range {
- debug!("Located ramdisk at {r:?}");
- let r = MEMORY.lock().as_mut().unwrap().alloc_range(&r).map_err(|e| {
- error!("Failed to obtain the initrd range: {e}");
- RebootReason::InvalidRamdisk
- })?;
-
- // SAFETY: The region was validated by memory to be in main memory, mapped, and
- // not overlap.
- Some(unsafe { slice::from_raw_parts(r.start as *const u8, r.len()) })
- } else {
- info!("Couldn't locate the ramdisk from the device tree");
- None
- };
-
- Ok(Self { fdt, kernel, ramdisk })
- }
-}
-
/// Sets up the environment for main() and wraps its result for start().
///
/// Provide the abstractions necessary for start() to abort the pVM boot and for main() to run with
@@ -240,7 +132,7 @@
Some(memory::appended_payload_range()),
));
- let slices = MemorySlices::new(
+ let slices = memory::MemorySlices::new(
fdt,
payload,
payload_size,
diff --git a/guest/pvmfw/src/exceptions.rs b/guest/pvmfw/src/exceptions.rs
index d9f0891..c16e637 100644
--- a/guest/pvmfw/src/exceptions.rs
+++ b/guest/pvmfw/src/exceptions.rs
@@ -16,9 +16,9 @@
use vmbase::{
eprintln,
+ exceptions::{handle_permission_fault, handle_translation_fault},
exceptions::{ArmException, Esr, HandleExceptionError},
logger,
- memory::{handle_permission_fault, handle_translation_fault},
power::reboot,
read_sysreg,
};
diff --git a/guest/pvmfw/src/fdt.rs b/guest/pvmfw/src/fdt.rs
index f667d60..0381f3e 100644
--- a/guest/pvmfw/src/fdt.rs
+++ b/guest/pvmfw/src/fdt.rs
@@ -49,10 +49,12 @@
use vmbase::hyp;
use vmbase::layout::{crosvm::MEM_START, MAX_VIRT_ADDR};
use vmbase::memory::SIZE_4KB;
-use vmbase::util::flatten;
use vmbase::util::RangeExt as _;
use zerocopy::AsBytes as _;
+// SAFETY: The template DT is automatically generated through DTC, which should produce valid DTBs.
+const FDT_TEMPLATE: &Fdt = unsafe { Fdt::unchecked_from_slice(pvmfw_fdt_template::RAW) };
+
/// An enumeration of errors that can occur during the FDT validation.
#[derive(Clone, Debug)]
pub enum FdtValidationError {
@@ -726,7 +728,7 @@
node.setprop_inplace(
cstr!("ranges"),
- flatten(&[pci_info.ranges[0].to_cells(), pci_info.ranges[1].to_cells()]),
+ [pci_info.ranges[0].to_cells(), pci_info.ranges[1].to_cells()].as_flattened(),
)
}
@@ -923,7 +925,7 @@
let mut node =
fdt.root_mut().next_compatible(cstr!("arm,gic-v3"))?.ok_or(FdtError::NotFound)?;
- node.setprop_inplace(cstr!("reg"), flatten(&value))
+ node.setprop_inplace(cstr!("reg"), value.as_flattened())
}
fn patch_timer(fdt: &mut Fdt, num_cpus: usize) -> libfdt::Result<()> {
@@ -1031,9 +1033,7 @@
let info = parse_device_tree(fdt, vm_dtbo.as_deref())?;
- // SAFETY: We trust that the template (hardcoded in our RO data) is a valid DT.
- let fdt_template = unsafe { Fdt::unchecked_from_slice(pvmfw_fdt_template::RAW) };
- fdt.clone_from(fdt_template).map_err(|e| {
+ fdt.clone_from(FDT_TEMPLATE).map_err(|e| {
error!("Failed to instantiate FDT from the template DT: {e}");
RebootReason::InvalidFdt
})?;
@@ -1327,7 +1327,7 @@
let addr: u64 = addr.try_into().unwrap();
let size: u64 = size.try_into().unwrap();
- node.setprop_inplace(cstr!("reg"), flatten(&[addr.to_be_bytes(), size.to_be_bytes()]))
+ node.setprop_inplace(cstr!("reg"), [addr.to_be_bytes(), size.to_be_bytes()].as_flattened())
}
fn empty_or_delete_prop(
diff --git a/guest/pvmfw/src/main.rs b/guest/pvmfw/src/main.rs
index 1e88c4b..aeced51 100644
--- a/guest/pvmfw/src/main.rs
+++ b/guest/pvmfw/src/main.rs
@@ -200,6 +200,8 @@
Cow::Owned(truncated_bcc_handover)
};
+ trace!("BCC leaf subject public key algorithm: {:?}", bcc.leaf_subject_pubkey().cose_alg);
+
dice_inputs
.write_next_bcc(
new_bcc_handover.as_ref(),
diff --git a/guest/pvmfw/src/memory.rs b/guest/pvmfw/src/memory.rs
index 8d12b57..f49d79b 100644
--- a/guest/pvmfw/src/memory.rs
+++ b/guest/pvmfw/src/memory.rs
@@ -14,15 +14,23 @@
//! Low-level allocation and tracking of main memory.
+use crate::entry::RebootReason;
+use crate::fdt;
use crate::helpers::PVMFW_PAGE_SIZE;
use aarch64_paging::paging::VirtualAddress;
use aarch64_paging::MapError;
+use core::num::NonZeroUsize;
use core::ops::Range;
use core::result;
+use core::slice;
+use log::debug;
use log::error;
+use log::info;
+use log::warn;
use vmbase::{
- layout,
- memory::{PageTable, SIZE_2MB, SIZE_4KB},
+ hyp::get_mem_sharer,
+ layout::{self, crosvm},
+ memory::{PageTable, MEMORY, SIZE_2MB, SIZE_4KB},
util::align_up,
};
@@ -57,3 +65,109 @@
}
Ok(page_table)
}
+
+pub(crate) struct MemorySlices<'a> {
+ pub fdt: &'a mut libfdt::Fdt,
+ pub kernel: &'a [u8],
+ pub ramdisk: Option<&'a [u8]>,
+}
+
+impl<'a> MemorySlices<'a> {
+ pub fn new(
+ fdt: usize,
+ kernel: usize,
+ kernel_size: usize,
+ vm_dtbo: Option<&mut [u8]>,
+ vm_ref_dt: Option<&[u8]>,
+ ) -> Result<Self, RebootReason> {
+ let fdt_size = NonZeroUsize::new(crosvm::FDT_MAX_SIZE).unwrap();
+ // TODO - Only map the FDT as read-only, until we modify it right before jump_to_payload()
+ // e.g. by generating a DTBO for a template DT in main() and, on return, re-map DT as RW,
+ // overwrite with the template DT and apply the DTBO.
+ let range = MEMORY.lock().as_mut().unwrap().alloc_mut(fdt, fdt_size).map_err(|e| {
+ error!("Failed to allocate the FDT range: {e}");
+ RebootReason::InternalError
+ })?;
+
+ // SAFETY: The tracker validated the range to be in main memory, mapped, and not overlap.
+ let fdt = unsafe { slice::from_raw_parts_mut(range.start as *mut u8, range.len()) };
+
+ let info = fdt::sanitize_device_tree(fdt, vm_dtbo, vm_ref_dt)?;
+ let fdt = libfdt::Fdt::from_mut_slice(fdt).map_err(|e| {
+ error!("Failed to load sanitized FDT: {e}");
+ RebootReason::InvalidFdt
+ })?;
+ debug!("Fdt passed validation!");
+
+ let memory_range = info.memory_range;
+ debug!("Resizing MemoryTracker to range {memory_range:#x?}");
+ MEMORY.lock().as_mut().unwrap().shrink(&memory_range).map_err(|e| {
+ error!("Failed to use memory range value from DT: {memory_range:#x?}: {e}");
+ RebootReason::InvalidFdt
+ })?;
+
+ if let Some(mem_sharer) = get_mem_sharer() {
+ let granule = mem_sharer.granule().map_err(|e| {
+ error!("Failed to get memory protection granule: {e}");
+ RebootReason::InternalError
+ })?;
+ MEMORY.lock().as_mut().unwrap().init_dynamic_shared_pool(granule).map_err(|e| {
+ error!("Failed to initialize dynamically shared pool: {e}");
+ RebootReason::InternalError
+ })?;
+ } else {
+ let range = info.swiotlb_info.fixed_range().ok_or_else(|| {
+ error!("Pre-shared pool range not specified in swiotlb node");
+ RebootReason::InvalidFdt
+ })?;
+
+ MEMORY.lock().as_mut().unwrap().init_static_shared_pool(range).map_err(|e| {
+ error!("Failed to initialize pre-shared pool {e}");
+ RebootReason::InvalidFdt
+ })?;
+ }
+
+ let kernel_range = if let Some(r) = info.kernel_range {
+ MEMORY.lock().as_mut().unwrap().alloc_range(&r).map_err(|e| {
+ error!("Failed to obtain the kernel range with DT range: {e}");
+ RebootReason::InternalError
+ })?
+ } else if cfg!(feature = "legacy") {
+ warn!("Failed to find the kernel range in the DT; falling back to legacy ABI");
+
+ let kernel_size = NonZeroUsize::new(kernel_size).ok_or_else(|| {
+ error!("Invalid kernel size: {kernel_size:#x}");
+ RebootReason::InvalidPayload
+ })?;
+
+ MEMORY.lock().as_mut().unwrap().alloc(kernel, kernel_size).map_err(|e| {
+ error!("Failed to obtain the kernel range with legacy range: {e}");
+ RebootReason::InternalError
+ })?
+ } else {
+ error!("Failed to locate the kernel from the DT");
+ return Err(RebootReason::InvalidPayload);
+ };
+
+ let kernel = kernel_range.start as *const u8;
+ // SAFETY: The tracker validated the range to be in main memory, mapped, and not overlap.
+ let kernel = unsafe { slice::from_raw_parts(kernel, kernel_range.len()) };
+
+ let ramdisk = if let Some(r) = info.initrd_range {
+ debug!("Located ramdisk at {r:?}");
+ let r = MEMORY.lock().as_mut().unwrap().alloc_range(&r).map_err(|e| {
+ error!("Failed to obtain the initrd range: {e}");
+ RebootReason::InvalidRamdisk
+ })?;
+
+ // SAFETY: The region was validated by memory to be in main memory, mapped, and
+ // not overlap.
+ Some(unsafe { slice::from_raw_parts(r.start as *const u8, r.len()) })
+ } else {
+ info!("Couldn't locate the ramdisk from the device tree");
+ None
+ };
+
+ Ok(Self { fdt, kernel, ramdisk })
+ }
+}
diff --git a/guest/rialto/src/exceptions.rs b/guest/rialto/src/exceptions.rs
index e87e0d3..8899796 100644
--- a/guest/rialto/src/exceptions.rs
+++ b/guest/rialto/src/exceptions.rs
@@ -16,9 +16,9 @@
use vmbase::{
eprintln,
+ exceptions::{handle_permission_fault, handle_translation_fault},
exceptions::{ArmException, Esr, HandleExceptionError},
logger,
- memory::{handle_permission_fault, handle_translation_fault},
power::reboot,
read_sysreg,
};
diff --git a/guest/rialto/src/main.rs b/guest/rialto/src/main.rs
index f09cbd2..ec9a76e 100644
--- a/guest/rialto/src/main.rs
+++ b/guest/rialto/src/main.rs
@@ -47,8 +47,8 @@
fdt::pci::PciInfo,
fdt::SwiotlbInfo,
generate_image_header,
- hyp::{get_mem_sharer, get_mmio_guard},
- layout::{self, crosvm, UART_PAGE_ADDR},
+ hyp::get_mem_sharer,
+ layout::{self, crosvm},
main,
memory::{MemoryTracker, PageTable, MEMORY, PAGE_SIZE, SIZE_128KB},
power::reboot,
@@ -188,36 +188,14 @@
.ok_or(Error::MissingVirtIOSocketDevice)
}
-fn try_unshare_all_memory() -> Result<()> {
- info!("Starting unsharing memory...");
-
- // No logging after unmapping UART.
- if let Some(mmio_guard) = get_mmio_guard() {
- mmio_guard.unmap(UART_PAGE_ADDR)?;
- }
- // Unshares all memory and deactivates page table.
- drop(MEMORY.lock().take());
- Ok(())
-}
-
-fn unshare_all_memory() {
- if let Err(e) = try_unshare_all_memory() {
- error!("Failed to unshare the memory: {e}");
- }
-}
-
/// Entry point for Rialto.
pub fn main(fdt_addr: u64, _a1: u64, _a2: u64, _a3: u64) {
log::set_max_level(log::LevelFilter::Debug);
// SAFETY: `fdt_addr` is supposed to be a valid pointer and points to
// a valid `Fdt`.
- match unsafe { try_main(fdt_addr as usize) } {
- Ok(()) => unshare_all_memory(),
- Err(e) => {
- error!("Rialto failed with {e}");
- unshare_all_memory();
- reboot()
- }
+ if let Err(e) = unsafe { try_main(fdt_addr as usize) } {
+ error!("Rialto failed with {e}");
+ reboot()
}
}
diff --git a/guest/trusty/security_vm/launcher/src/main.rs b/guest/trusty/security_vm/launcher/src/main.rs
index c5cc6b4..bdb4ed8 100644
--- a/guest/trusty/security_vm/launcher/src/main.rs
+++ b/guest/trusty/security_vm/launcher/src/main.rs
@@ -34,6 +34,14 @@
/// Whether the VM is protected or not.
#[arg(long)]
protected: bool,
+
+ /// Name of the VM. Used to pull correct config from early_vms.xml
+ #[arg(long, default_value = "trusty_security_vm_launcher")]
+ name: String,
+
+ /// Memory size of the VM in MiB
+ #[arg(long, default_value_t = 128)]
+ memory_size_mib: i32,
}
fn get_service() -> Result<Strong<dyn IVirtualizationService>> {
@@ -51,10 +59,10 @@
File::open(&args.kernel).with_context(|| format!("Failed to open {:?}", &args.kernel))?;
let vm_config = VirtualMachineConfig::RawConfig(VirtualMachineRawConfig {
- name: "trusty_security_vm_launcher".to_owned(),
+ name: args.name.to_owned(),
kernel: Some(ParcelFileDescriptor::new(kernel)),
protectedVm: args.protected,
- memoryMib: 128,
+ memoryMib: args.memory_size_mib,
platformVersion: "~1.0".to_owned(),
// TODO: add instanceId
..Default::default()
diff --git a/libs/libfdt/src/lib.rs b/libs/libfdt/src/lib.rs
index 8ea9cd9..5883567 100644
--- a/libs/libfdt/src/lib.rs
+++ b/libs/libfdt/src/lib.rs
@@ -624,7 +624,7 @@
/// # Safety
///
/// It is undefined to call this function on a slice that does not contain a valid device tree.
- pub unsafe fn unchecked_from_slice(fdt: &[u8]) -> &Self {
+ pub const unsafe fn unchecked_from_slice(fdt: &[u8]) -> &Self {
let self_ptr = fdt as *const _ as *const _;
// SAFETY: The pointer is non-null, dereferenceable, and points to allocated memory.
unsafe { &*self_ptr }
diff --git a/libs/libvmbase/Android.bp b/libs/libvmbase/Android.bp
index 206c4cb..c4e8385 100644
--- a/libs/libvmbase/Android.bp
+++ b/libs/libvmbase/Android.bp
@@ -79,6 +79,7 @@
rustlibs: [
"libaarch64_paging",
"libbuddy_system_allocator",
+ "libcfg_if",
"libcstr",
"liblibfdt_nostd",
"liblog_rust_nostd",
diff --git a/libs/libvmbase/src/arch.rs b/libs/libvmbase/src/arch.rs
index 992ab27..0348800 100644
--- a/libs/libvmbase/src/arch.rs
+++ b/libs/libvmbase/src/arch.rs
@@ -1,4 +1,4 @@
-// Copyright 2023, The Android Open Source Project
+// Copyright 2024, The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,85 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-//! Wrappers of assembly calls.
+//! Low-level CPU-specific operations.
-/// Reads a value from a system register.
-#[macro_export]
-macro_rules! read_sysreg {
- ($sysreg:literal) => {{
- let mut r: usize;
- #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
- // SAFETY: Reading a system register does not affect memory.
- unsafe {
- core::arch::asm!(
- concat!("mrs {}, ", $sysreg),
- out(reg) r,
- options(nomem, nostack, preserves_flags),
- )
- }
- r
- }};
-}
-
-/// Writes a value to a system register.
-///
-/// # Safety
-///
-/// Callers must ensure that side effects of updating the system register are properly handled.
-#[macro_export]
-macro_rules! write_sysreg {
- ($sysreg:literal, $val:expr) => {{
- let value: usize = $val;
- core::arch::asm!(
- concat!("msr ", $sysreg, ", {}"),
- in(reg) value,
- options(nomem, nostack, preserves_flags),
- )
- }};
-}
-
-/// Executes an instruction synchronization barrier.
-#[macro_export]
-macro_rules! isb {
- () => {{
- #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
- // SAFETY: memory barriers do not affect Rust's memory model.
- unsafe {
- core::arch::asm!("isb", options(nomem, nostack, preserves_flags));
- }
- }};
-}
-
-/// Executes a data synchronization barrier.
-#[macro_export]
-macro_rules! dsb {
- ($option:literal) => {{
- #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
- // SAFETY: memory barriers do not affect Rust's memory model.
- unsafe {
- core::arch::asm!(concat!("dsb ", $option), options(nomem, nostack, preserves_flags));
- }
- }};
-}
-
-/// Invalidates cached leaf PTE entries by virtual address.
-#[macro_export]
-macro_rules! tlbi {
- ($option:literal, $asid:expr, $addr:expr) => {{
- let asid: usize = $asid;
- let addr: usize = $addr;
- #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
- // SAFETY: Invalidating the TLB doesn't affect Rust. When the address matches a
- // block entry larger than the page size, all translations for the block are invalidated.
- unsafe {
- core::arch::asm!(
- concat!("tlbi ", $option, ", {x}"),
- x = in(reg) (asid << 48) | (addr >> 12),
- options(nomem, nostack, preserves_flags)
- );
- }
- }};
-}
+#[cfg(target_arch = "aarch64")]
+pub mod aarch64;
/// Write with well-defined compiled behavior.
///
@@ -99,14 +24,32 @@
/// # Safety
///
/// `dst` must be valid for writes.
+#[inline]
pub unsafe fn write_volatile_u8(dst: *mut u8, src: u8) {
- // SAFETY: strb only modifies *dst, which must be valid for writes.
- unsafe {
- core::arch::asm!(
- "strb {value:w}, [{ptr}]",
- value = in(reg) src,
- ptr = in(reg) dst,
- options(preserves_flags),
- );
+ cfg_if::cfg_if! {
+ if #[cfg(target_arch = "aarch64")] {
+ // SAFETY: `dst` is valid for writes.
+ unsafe { aarch64::strb(dst, src) }
+ } else {
+ compile_error!("Unsupported target_arch")
+ }
+ }
+}
+
+/// Flush `size` bytes of data cache by virtual address.
+#[inline]
+pub(crate) fn flush_region(start: usize, size: usize) {
+ cfg_if::cfg_if! {
+ if #[cfg(target_arch = "aarch64")] {
+ let line_size = aarch64::min_dcache_line_size();
+ let end = start + size;
+ let start = crate::util::unchecked_align_down(start, line_size);
+
+ for line in (start..end).step_by(line_size) {
+ crate::dc!("cvau", line);
+ }
+ } else {
+ compile_error!("Unsupported target_arch")
+ }
}
}
diff --git a/libs/libvmbase/src/arch/aarch64.rs b/libs/libvmbase/src/arch/aarch64.rs
new file mode 100644
index 0000000..5006aca
--- /dev/null
+++ b/libs/libvmbase/src/arch/aarch64.rs
@@ -0,0 +1,143 @@
+// Copyright 2023, The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Wrappers of assembly calls.
+
+/// Reads a value from a system register.
+#[macro_export]
+macro_rules! read_sysreg {
+ ($sysreg:literal) => {{
+ let mut r: usize;
+ #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
+ // SAFETY: Reading a system register does not affect memory.
+ unsafe {
+ core::arch::asm!(
+ concat!("mrs {}, ", $sysreg),
+ out(reg) r,
+ options(nomem, nostack, preserves_flags),
+ )
+ }
+ r
+ }};
+}
+
+/// Writes a value to a system register.
+///
+/// # Safety
+///
+/// Callers must ensure that side effects of updating the system register are properly handled.
+#[macro_export]
+macro_rules! write_sysreg {
+ ($sysreg:literal, $val:expr) => {{
+ let value: usize = $val;
+ core::arch::asm!(
+ concat!("msr ", $sysreg, ", {}"),
+ in(reg) value,
+ options(nomem, nostack, preserves_flags),
+ )
+ }};
+}
+
+/// Executes an instruction synchronization barrier.
+#[macro_export]
+macro_rules! isb {
+ () => {{
+ #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
+ // SAFETY: memory barriers do not affect Rust's memory model.
+ unsafe {
+ core::arch::asm!("isb", options(nomem, nostack, preserves_flags));
+ }
+ }};
+}
+
+/// Executes a data synchronization barrier.
+#[macro_export]
+macro_rules! dsb {
+ ($option:literal) => {{
+ #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
+ // SAFETY: memory barriers do not affect Rust's memory model.
+ unsafe {
+ core::arch::asm!(concat!("dsb ", $option), options(nomem, nostack, preserves_flags));
+ }
+ }};
+}
+
+/// Executes a data cache operation.
+#[macro_export]
+macro_rules! dc {
+ ($option:literal, $addr:expr) => {{
+ let addr: usize = $addr;
+ #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
+ // SAFETY: Clearing cache lines shouldn't have Rust-visible side effects.
+ unsafe {
+ core::arch::asm!(
+ concat!("dc ", $option, ", {x}"),
+ x = in(reg) addr,
+ options(nomem, nostack, preserves_flags),
+ );
+ }
+ }};
+}
+
+/// Invalidates cached leaf PTE entries by virtual address.
+#[macro_export]
+macro_rules! tlbi {
+ ($option:literal, $asid:expr, $addr:expr) => {{
+ let asid: usize = $asid;
+ let addr: usize = $addr;
+ #[allow(unused_unsafe)] // In case the macro is used within an unsafe block.
+ // SAFETY: Invalidating the TLB doesn't affect Rust. When the address matches a
+ // block entry larger than the page size, all translations for the block are invalidated.
+ unsafe {
+ core::arch::asm!(
+ concat!("tlbi ", $option, ", {x}"),
+ x = in(reg) (asid << 48) | (addr >> 12),
+ options(nomem, nostack, preserves_flags)
+ );
+ }
+ }};
+}
+
+/// STRB intrinsics.
+///
+/// See https://github.com/rust-lang/rust/issues/131894
+///
+/// # Safety
+///
+/// `dst` must be valid for writes.
+#[inline]
+pub unsafe fn strb(dst: *mut u8, src: u8) {
+ // SAFETY: strb only modifies *dst, which must be valid for writes.
+ unsafe {
+ core::arch::asm!(
+ "strb {value:w}, [{ptr}]",
+ value = in(reg) src,
+ ptr = in(reg) dst,
+ options(preserves_flags),
+ );
+ }
+}
+
+/// Reads the number of words in the smallest cache line of all the data caches and unified caches.
+#[inline]
+pub fn min_dcache_line_size() -> usize {
+ const DMINLINE_SHIFT: usize = 16;
+ const DMINLINE_MASK: usize = 0xf;
+ let ctr_el0 = read_sysreg!("ctr_el0");
+
+ // DminLine: log2 of the number of words in the smallest cache line of all the data caches.
+ let dminline = (ctr_el0 >> DMINLINE_SHIFT) & DMINLINE_MASK;
+
+ 1 << dminline
+}
diff --git a/libs/libvmbase/src/exceptions.rs b/libs/libvmbase/src/exceptions.rs
index 11fcd93..b04cb16 100644
--- a/libs/libvmbase/src/exceptions.rs
+++ b/libs/libvmbase/src/exceptions.rs
@@ -17,11 +17,12 @@
use crate::{
eprintln,
layout::UART_PAGE_ADDR,
- memory::{page_4kb_of, MemoryTrackerError},
+ memory::{page_4kb_of, MemoryTrackerError, MEMORY},
read_sysreg,
};
use aarch64_paging::paging::VirtualAddress;
use core::fmt;
+use core::result;
/// Represents an error that can occur while handling an exception.
#[derive(Debug)]
@@ -136,3 +137,19 @@
self.esr == Esr::DataAbortSyncExternalAbort && page_4kb_of(self.far.0) == UART_PAGE_ADDR
}
}
+
+/// Handles a translation fault with the given fault address register (FAR).
+#[inline]
+pub fn handle_translation_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
+ let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
+ let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
+ Ok(memory.handle_mmio_fault(far)?)
+}
+
+/// Handles a permission fault with the given fault address register (FAR).
+#[inline]
+pub fn handle_permission_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
+ let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
+ let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
+ Ok(memory.handle_permission_fault(far)?)
+}
diff --git a/libs/libvmbase/src/memory.rs b/libs/libvmbase/src/memory.rs
index 299d50f..e0ea207 100644
--- a/libs/libvmbase/src/memory.rs
+++ b/libs/libvmbase/src/memory.rs
@@ -18,16 +18,16 @@
mod error;
mod page_table;
mod shared;
+mod tracker;
mod util;
pub use error::MemoryTrackerError;
pub use page_table::PageTable;
-pub use shared::{
- handle_permission_fault, handle_translation_fault, MemoryRange, MemoryTracker, MEMORY,
-};
+pub use shared::MemoryRange;
+pub use tracker::{MemoryTracker, MEMORY};
pub use util::{
- flush, flushed_zeroize, min_dcache_line_size, page_4kb_of, PAGE_SIZE, SIZE_128KB, SIZE_16KB,
- SIZE_2MB, SIZE_4KB, SIZE_4MB, SIZE_64KB,
+ flush, flushed_zeroize, page_4kb_of, PAGE_SIZE, SIZE_128KB, SIZE_16KB, SIZE_2MB, SIZE_4KB,
+ SIZE_4MB, SIZE_64KB,
};
pub(crate) use shared::{alloc_shared, dealloc_shared};
diff --git a/libs/libvmbase/src/memory/dbm.rs b/libs/libvmbase/src/memory/dbm.rs
index 108cd5d..de43403 100644
--- a/libs/libvmbase/src/memory/dbm.rs
+++ b/libs/libvmbase/src/memory/dbm.rs
@@ -15,7 +15,7 @@
//! Hardware management of the access flag and dirty state.
use super::page_table::PageTable;
-use super::util::flush_region;
+use crate::arch::flush_region;
use crate::{dsb, isb, read_sysreg, tlbi, write_sysreg};
use aarch64_paging::paging::{Attributes, Descriptor, MemoryRegion};
diff --git a/libs/libvmbase/src/memory/shared.rs b/libs/libvmbase/src/memory/shared.rs
index d869b16..92dd09e 100644
--- a/libs/libvmbase/src/memory/shared.rs
+++ b/libs/libvmbase/src/memory/shared.rs
@@ -14,378 +14,40 @@
//! Shared memory management.
-use super::dbm::{flush_dirty_range, mark_dirty_block, set_dbm_enabled};
use super::error::MemoryTrackerError;
-use super::page_table::{PageTable, MMIO_LAZY_MAP_FLAG};
use super::util::virt_to_phys;
-use crate::dsb;
-use crate::exceptions::HandleExceptionError;
use crate::hyp::{self, get_mem_sharer, get_mmio_guard};
use crate::layout;
use crate::util::unchecked_align_down;
-use crate::util::RangeExt as _;
-use aarch64_paging::paging::{
- Attributes, Descriptor, MemoryRegion as VaRange, VirtualAddress, PAGE_SIZE,
-};
+use aarch64_paging::paging::{MemoryRegion as VaRange, VirtualAddress, PAGE_SIZE};
use alloc::alloc::{alloc_zeroed, dealloc, handle_alloc_error};
-use alloc::boxed::Box;
use alloc::collections::BTreeSet;
use alloc::vec::Vec;
use buddy_system_allocator::{FrameAllocator, LockedFrameAllocator};
use core::alloc::Layout;
use core::cmp::max;
-use core::mem::size_of;
-use core::num::NonZeroUsize;
use core::ops::Range;
use core::ptr::NonNull;
use core::result;
-use log::{debug, error, trace};
+use log::trace;
use once_cell::race::OnceBox;
use spin::mutex::SpinMutex;
-use tinyvec::ArrayVec;
-/// A global static variable representing the system memory tracker, protected by a spin mutex.
-pub static MEMORY: SpinMutex<Option<MemoryTracker>> = SpinMutex::new(None);
-
-static SHARED_POOL: OnceBox<LockedFrameAllocator<32>> = OnceBox::new();
-static SHARED_MEMORY: SpinMutex<Option<MemorySharer>> = SpinMutex::new(None);
+pub(crate) static SHARED_POOL: OnceBox<LockedFrameAllocator<32>> = OnceBox::new();
+pub(crate) static SHARED_MEMORY: SpinMutex<Option<MemorySharer>> = SpinMutex::new(None);
/// Memory range.
pub type MemoryRange = Range<usize>;
-fn get_va_range(range: &MemoryRange) -> VaRange {
- VaRange::new(range.start, range.end)
-}
-
type Result<T> = result::Result<T, MemoryTrackerError>;
-#[derive(Clone, Copy, Debug, Default, PartialEq)]
-enum MemoryType {
- #[default]
- ReadOnly,
- ReadWrite,
-}
-
-#[derive(Clone, Debug, Default)]
-struct MemoryRegion {
- range: MemoryRange,
- mem_type: MemoryType,
-}
-
-/// Tracks non-overlapping slices of main memory.
-pub struct MemoryTracker {
- total: MemoryRange,
- page_table: PageTable,
- regions: ArrayVec<[MemoryRegion; MemoryTracker::CAPACITY]>,
- mmio_regions: ArrayVec<[MemoryRange; MemoryTracker::MMIO_CAPACITY]>,
- mmio_range: MemoryRange,
- payload_range: Option<MemoryRange>,
- mmio_sharer: MmioSharer,
-}
-
-impl MemoryTracker {
- const CAPACITY: usize = 5;
- const MMIO_CAPACITY: usize = 5;
-
- /// Creates a new instance from an active page table, covering the maximum RAM size.
- pub fn new(
- mut page_table: PageTable,
- total: MemoryRange,
- mmio_range: MemoryRange,
- payload_range: Option<Range<VirtualAddress>>,
- ) -> Self {
- assert!(
- !total.overlaps(&mmio_range),
- "MMIO space should not overlap with the main memory region."
- );
-
- // Activate dirty state management first, otherwise we may get permission faults immediately
- // after activating the new page table. This has no effect before the new page table is
- // activated because none of the entries in the initial idmap have the DBM flag.
- set_dbm_enabled(true);
-
- debug!("Activating dynamic page table...");
- // SAFETY: page_table duplicates the static mappings for everything that the Rust code is
- // aware of so activating it shouldn't have any visible effect.
- unsafe { page_table.activate() }
- debug!("... Success!");
-
- Self {
- total,
- page_table,
- regions: ArrayVec::new(),
- mmio_regions: ArrayVec::new(),
- mmio_range,
- payload_range: payload_range.map(|r| r.start.0..r.end.0),
- mmio_sharer: MmioSharer::new().unwrap(),
- }
- }
-
- /// Resize the total RAM size.
- ///
- /// This function fails if it contains regions that are not included within the new size.
- pub fn shrink(&mut self, range: &MemoryRange) -> Result<()> {
- if range.start != self.total.start {
- return Err(MemoryTrackerError::DifferentBaseAddress);
- }
- if self.total.end < range.end {
- return Err(MemoryTrackerError::SizeTooLarge);
- }
- if !self.regions.iter().all(|r| r.range.is_within(range)) {
- return Err(MemoryTrackerError::SizeTooSmall);
- }
-
- self.total = range.clone();
- Ok(())
- }
-
- /// Allocate the address range for a const slice; returns None if failed.
- pub fn alloc_range(&mut self, range: &MemoryRange) -> Result<MemoryRange> {
- let region = MemoryRegion { range: range.clone(), mem_type: MemoryType::ReadOnly };
- self.check_allocatable(®ion)?;
- self.page_table.map_rodata(&get_va_range(range)).map_err(|e| {
- error!("Error during range allocation: {e}");
- MemoryTrackerError::FailedToMap
- })?;
- self.add(region)
- }
-
- /// Allocates the address range for a const slice.
- ///
- /// # Safety
- ///
- /// Callers of this method need to ensure that the `range` is valid for mapping as read-only
- /// data.
- pub unsafe fn alloc_range_outside_main_memory(
- &mut self,
- range: &MemoryRange,
- ) -> Result<MemoryRange> {
- let region = MemoryRegion { range: range.clone(), mem_type: MemoryType::ReadOnly };
- self.check_no_overlap(®ion)?;
- self.page_table.map_rodata(&get_va_range(range)).map_err(|e| {
- error!("Error during range allocation: {e}");
- MemoryTrackerError::FailedToMap
- })?;
- self.add(region)
- }
-
- /// Allocate the address range for a mutable slice; returns None if failed.
- pub fn alloc_range_mut(&mut self, range: &MemoryRange) -> Result<MemoryRange> {
- let region = MemoryRegion { range: range.clone(), mem_type: MemoryType::ReadWrite };
- self.check_allocatable(®ion)?;
- self.page_table.map_data_dbm(&get_va_range(range)).map_err(|e| {
- error!("Error during mutable range allocation: {e}");
- MemoryTrackerError::FailedToMap
- })?;
- self.add(region)
- }
-
- /// Allocate the address range for a const slice; returns None if failed.
- pub fn alloc(&mut self, base: usize, size: NonZeroUsize) -> Result<MemoryRange> {
- self.alloc_range(&(base..(base + size.get())))
- }
-
- /// Allocate the address range for a mutable slice; returns None if failed.
- pub fn alloc_mut(&mut self, base: usize, size: NonZeroUsize) -> Result<MemoryRange> {
- self.alloc_range_mut(&(base..(base + size.get())))
- }
-
- /// Checks that the given range of addresses is within the MMIO region, and then maps it
- /// appropriately.
- pub fn map_mmio_range(&mut self, range: MemoryRange) -> Result<()> {
- if !range.is_within(&self.mmio_range) {
- return Err(MemoryTrackerError::OutOfRange);
- }
- if self.mmio_regions.iter().any(|r| range.overlaps(r)) {
- return Err(MemoryTrackerError::Overlaps);
- }
- if self.mmio_regions.len() == self.mmio_regions.capacity() {
- return Err(MemoryTrackerError::Full);
- }
-
- if get_mmio_guard().is_some() {
- self.page_table.map_device_lazy(&get_va_range(&range)).map_err(|e| {
- error!("Error during lazy MMIO device mapping: {e}");
- MemoryTrackerError::FailedToMap
- })?;
- } else {
- self.page_table.map_device(&get_va_range(&range)).map_err(|e| {
- error!("Error during MMIO device mapping: {e}");
- MemoryTrackerError::FailedToMap
- })?;
- }
-
- if self.mmio_regions.try_push(range).is_some() {
- return Err(MemoryTrackerError::Full);
- }
-
- Ok(())
- }
-
- /// Checks that the memory region meets the following criteria:
- /// - It is within the range of the `MemoryTracker`.
- /// - It does not overlap with any previously allocated regions.
- /// - The `regions` ArrayVec has sufficient capacity to add it.
- fn check_allocatable(&self, region: &MemoryRegion) -> Result<()> {
- if !region.range.is_within(&self.total) {
- return Err(MemoryTrackerError::OutOfRange);
- }
- self.check_no_overlap(region)
- }
-
- /// Checks that the given region doesn't overlap with any other previously allocated regions,
- /// and that the regions ArrayVec has capacity to add it.
- fn check_no_overlap(&self, region: &MemoryRegion) -> Result<()> {
- if self.regions.iter().any(|r| region.range.overlaps(&r.range)) {
- return Err(MemoryTrackerError::Overlaps);
- }
- if self.regions.len() == self.regions.capacity() {
- return Err(MemoryTrackerError::Full);
- }
- Ok(())
- }
-
- fn add(&mut self, region: MemoryRegion) -> Result<MemoryRange> {
- if self.regions.try_push(region).is_some() {
- return Err(MemoryTrackerError::Full);
- }
-
- Ok(self.regions.last().unwrap().range.clone())
- }
-
- /// Unshares any MMIO region previously shared with the MMIO guard.
- pub fn unshare_all_mmio(&mut self) -> Result<()> {
- self.mmio_sharer.unshare_all();
-
- Ok(())
- }
-
- /// Initialize the shared heap to dynamically share memory from the global allocator.
- pub fn init_dynamic_shared_pool(&mut self, granule: usize) -> Result<()> {
- const INIT_CAP: usize = 10;
-
- let previous = SHARED_MEMORY.lock().replace(MemorySharer::new(granule, INIT_CAP));
- if previous.is_some() {
- return Err(MemoryTrackerError::SharedMemorySetFailure);
- }
-
- SHARED_POOL
- .set(Box::new(LockedFrameAllocator::new()))
- .map_err(|_| MemoryTrackerError::SharedPoolSetFailure)?;
-
- Ok(())
- }
-
- /// Initialize the shared heap from a static region of memory.
- ///
- /// Some hypervisors such as Gunyah do not support a MemShare API for guest
- /// to share its memory with host. Instead they allow host to designate part
- /// of guest memory as "shared" ahead of guest starting its execution. The
- /// shared memory region is indicated in swiotlb node. On such platforms use
- /// a separate heap to allocate buffers that can be shared with host.
- pub fn init_static_shared_pool(&mut self, range: Range<usize>) -> Result<()> {
- let size = NonZeroUsize::new(range.len()).unwrap();
- let range = self.alloc_mut(range.start, size)?;
- let shared_pool = LockedFrameAllocator::<32>::new();
-
- shared_pool.lock().insert(range);
-
- SHARED_POOL
- .set(Box::new(shared_pool))
- .map_err(|_| MemoryTrackerError::SharedPoolSetFailure)?;
-
- Ok(())
- }
-
- /// Initialize the shared heap to use heap memory directly.
- ///
- /// When running on "non-protected" hypervisors which permit host direct accesses to guest
- /// memory, there is no need to perform any memory sharing and/or allocate buffers from a
- /// dedicated region so this function instructs the shared pool to use the global allocator.
- pub fn init_heap_shared_pool(&mut self) -> Result<()> {
- // As MemorySharer only calls MEM_SHARE methods if the hypervisor supports them, internally
- // using init_dynamic_shared_pool() on a non-protected platform will make use of the heap
- // without any actual "dynamic memory sharing" taking place and, as such, the granule may
- // be set to the one of the global_allocator i.e. a byte.
- self.init_dynamic_shared_pool(size_of::<u8>())
- }
-
- /// Unshares any memory that may have been shared.
- pub fn unshare_all_memory(&mut self) {
- drop(SHARED_MEMORY.lock().take());
- }
-
- /// Handles translation fault for blocks flagged for lazy MMIO mapping by enabling the page
- /// table entry and MMIO guard mapping the block. Breaks apart a block entry if required.
- fn handle_mmio_fault(&mut self, addr: VirtualAddress) -> Result<()> {
- let shared_range = self.mmio_sharer.share(addr)?;
- self.map_lazy_mmio_as_valid(&shared_range)?;
-
- Ok(())
- }
-
- /// Modify the PTEs corresponding to a given range from (invalid) "lazy MMIO" to valid MMIO.
- ///
- /// Returns an error if any PTE in the range is not an invalid lazy MMIO mapping.
- fn map_lazy_mmio_as_valid(&mut self, page_range: &VaRange) -> Result<()> {
- // This must be safe and free from break-before-make (BBM) violations, given that the
- // initial lazy mapping has the valid bit cleared, and each newly created valid descriptor
- // created inside the mapping has the same size and alignment.
- self.page_table
- .modify_range(page_range, &|_: &VaRange, desc: &mut Descriptor, _: usize| {
- let flags = desc.flags().expect("Unsupported PTE flags set");
- if flags.contains(MMIO_LAZY_MAP_FLAG) && !flags.contains(Attributes::VALID) {
- desc.modify_flags(Attributes::VALID, Attributes::empty());
- Ok(())
- } else {
- Err(())
- }
- })
- .map_err(|_| MemoryTrackerError::InvalidPte)
- }
-
- /// Flush all memory regions marked as writable-dirty.
- fn flush_dirty_pages(&mut self) -> Result<()> {
- // Collect memory ranges for which dirty state is tracked.
- let writable_regions =
- self.regions.iter().filter(|r| r.mem_type == MemoryType::ReadWrite).map(|r| &r.range);
- // Execute a barrier instruction to ensure all hardware updates to the page table have been
- // observed before reading PTE flags to determine dirty state.
- dsb!("ish");
- // Now flush writable-dirty pages in those regions.
- for range in writable_regions.chain(self.payload_range.as_ref().into_iter()) {
- self.page_table
- .walk_range(&get_va_range(range), &flush_dirty_range)
- .map_err(|_| MemoryTrackerError::FlushRegionFailed)?;
- }
- Ok(())
- }
-
- /// Handles permission fault for read-only blocks by setting writable-dirty state.
- /// In general, this should be called from the exception handler when hardware dirty
- /// state management is disabled or unavailable.
- fn handle_permission_fault(&mut self, addr: VirtualAddress) -> Result<()> {
- self.page_table
- .modify_range(&(addr..addr + 1).into(), &mark_dirty_block)
- .map_err(|_| MemoryTrackerError::SetPteDirtyFailed)
- }
-}
-
-impl Drop for MemoryTracker {
- fn drop(&mut self) {
- set_dbm_enabled(false);
- self.flush_dirty_pages().unwrap();
- self.unshare_all_memory();
- }
-}
-
-struct MmioSharer {
+pub(crate) struct MmioSharer {
granule: usize,
frames: BTreeSet<usize>,
}
impl MmioSharer {
- fn new() -> Result<Self> {
+ pub fn new() -> Result<Self> {
let granule = Self::get_granule()?;
let frames = BTreeSet::new();
@@ -395,7 +57,7 @@
Ok(Self { granule, frames })
}
- fn get_granule() -> Result<usize> {
+ pub fn get_granule() -> Result<usize> {
let Some(mmio_guard) = get_mmio_guard() else {
return Ok(PAGE_SIZE);
};
@@ -406,7 +68,7 @@
}
/// Share the MMIO region aligned to the granule size containing addr (not validated as MMIO).
- fn share(&mut self, addr: VirtualAddress) -> Result<VaRange> {
+ pub fn share(&mut self, addr: VirtualAddress) -> Result<VaRange> {
// This can't use virt_to_phys() since 0x0 is a valid MMIO address and we are ID-mapped.
let phys = addr.0;
let base = unchecked_align_down(phys, self.granule);
@@ -427,7 +89,7 @@
Ok((base_va..base_va + self.granule).into())
}
- fn unshare_all(&mut self) {
+ pub fn unshare_all(&mut self) {
let Some(mmio_guard) = get_mmio_guard() else {
return self.frames.clear();
};
@@ -491,7 +153,7 @@
/// Allocates memory on the heap and shares it with the host.
///
/// Unshares all pages when dropped.
-struct MemorySharer {
+pub(crate) struct MemorySharer {
granule: usize,
frames: Vec<(usize, Layout)>,
}
@@ -499,13 +161,13 @@
impl MemorySharer {
/// Constructs a new `MemorySharer` instance with the specified granule size and capacity.
/// `granule` must be a power of 2.
- fn new(granule: usize, capacity: usize) -> Self {
+ pub fn new(granule: usize, capacity: usize) -> Self {
assert!(granule.is_power_of_two());
Self { granule, frames: Vec::with_capacity(capacity) }
}
/// Gets from the global allocator a granule-aligned region that suits `hint` and share it.
- fn refill(&mut self, pool: &mut FrameAllocator<32>, hint: Layout) {
+ pub fn refill(&mut self, pool: &mut FrameAllocator<32>, hint: Layout) {
let layout = hint.align_to(self.granule).unwrap().pad_to_align();
assert_ne!(layout.size(), 0);
// SAFETY: layout has non-zero size.
@@ -546,19 +208,3 @@
}
}
}
-
-/// Handles a translation fault with the given fault address register (FAR).
-#[inline]
-pub fn handle_translation_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
- let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
- let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
- Ok(memory.handle_mmio_fault(far)?)
-}
-
-/// Handles a permission fault with the given fault address register (FAR).
-#[inline]
-pub fn handle_permission_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
- let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
- let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
- Ok(memory.handle_permission_fault(far)?)
-}
diff --git a/libs/libvmbase/src/memory/tracker.rs b/libs/libvmbase/src/memory/tracker.rs
new file mode 100644
index 0000000..acf182f
--- /dev/null
+++ b/libs/libvmbase/src/memory/tracker.rs
@@ -0,0 +1,363 @@
+// Copyright 2024, The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Memory management.
+
+use super::dbm::{flush_dirty_range, mark_dirty_block, set_dbm_enabled};
+use super::error::MemoryTrackerError;
+use super::page_table::{PageTable, MMIO_LAZY_MAP_FLAG};
+use super::shared::{SHARED_MEMORY, SHARED_POOL};
+use crate::dsb;
+use crate::hyp::get_mmio_guard;
+use crate::memory::shared::{MemoryRange, MemorySharer, MmioSharer};
+use crate::util::RangeExt as _;
+use aarch64_paging::paging::{Attributes, Descriptor, MemoryRegion as VaRange, VirtualAddress};
+use alloc::boxed::Box;
+use buddy_system_allocator::LockedFrameAllocator;
+use core::mem::size_of;
+use core::num::NonZeroUsize;
+use core::ops::Range;
+use core::result;
+use log::{debug, error};
+use spin::mutex::SpinMutex;
+use tinyvec::ArrayVec;
+
+/// A global static variable representing the system memory tracker, protected by a spin mutex.
+pub static MEMORY: SpinMutex<Option<MemoryTracker>> = SpinMutex::new(None);
+
+fn get_va_range(range: &MemoryRange) -> VaRange {
+ VaRange::new(range.start, range.end)
+}
+
+type Result<T> = result::Result<T, MemoryTrackerError>;
+
+#[derive(Clone, Copy, Debug, Default, PartialEq)]
+enum MemoryType {
+ #[default]
+ ReadOnly,
+ ReadWrite,
+}
+
+#[derive(Clone, Debug, Default)]
+struct MemoryRegion {
+ range: MemoryRange,
+ mem_type: MemoryType,
+}
+
+/// Tracks non-overlapping slices of main memory.
+pub struct MemoryTracker {
+ total: MemoryRange,
+ page_table: PageTable,
+ regions: ArrayVec<[MemoryRegion; MemoryTracker::CAPACITY]>,
+ mmio_regions: ArrayVec<[MemoryRange; MemoryTracker::MMIO_CAPACITY]>,
+ mmio_range: MemoryRange,
+ payload_range: Option<MemoryRange>,
+ mmio_sharer: MmioSharer,
+}
+
+impl MemoryTracker {
+ const CAPACITY: usize = 5;
+ const MMIO_CAPACITY: usize = 5;
+
+ /// Creates a new instance from an active page table, covering the maximum RAM size.
+ pub fn new(
+ mut page_table: PageTable,
+ total: MemoryRange,
+ mmio_range: MemoryRange,
+ payload_range: Option<Range<VirtualAddress>>,
+ ) -> Self {
+ assert!(
+ !total.overlaps(&mmio_range),
+ "MMIO space should not overlap with the main memory region."
+ );
+
+ // Activate dirty state management first, otherwise we may get permission faults immediately
+ // after activating the new page table. This has no effect before the new page table is
+ // activated because none of the entries in the initial idmap have the DBM flag.
+ set_dbm_enabled(true);
+
+ debug!("Activating dynamic page table...");
+ // SAFETY: page_table duplicates the static mappings for everything that the Rust code is
+ // aware of so activating it shouldn't have any visible effect.
+ unsafe { page_table.activate() }
+ debug!("... Success!");
+
+ Self {
+ total,
+ page_table,
+ regions: ArrayVec::new(),
+ mmio_regions: ArrayVec::new(),
+ mmio_range,
+ payload_range: payload_range.map(|r| r.start.0..r.end.0),
+ mmio_sharer: MmioSharer::new().unwrap(),
+ }
+ }
+
+ /// Resize the total RAM size.
+ ///
+ /// This function fails if it contains regions that are not included within the new size.
+ pub fn shrink(&mut self, range: &MemoryRange) -> Result<()> {
+ if range.start != self.total.start {
+ return Err(MemoryTrackerError::DifferentBaseAddress);
+ }
+ if self.total.end < range.end {
+ return Err(MemoryTrackerError::SizeTooLarge);
+ }
+ if !self.regions.iter().all(|r| r.range.is_within(range)) {
+ return Err(MemoryTrackerError::SizeTooSmall);
+ }
+
+ self.total = range.clone();
+ Ok(())
+ }
+
+ /// Allocate the address range for a const slice; returns None if failed.
+ pub fn alloc_range(&mut self, range: &MemoryRange) -> Result<MemoryRange> {
+ let region = MemoryRegion { range: range.clone(), mem_type: MemoryType::ReadOnly };
+ self.check_allocatable(®ion)?;
+ self.page_table.map_rodata(&get_va_range(range)).map_err(|e| {
+ error!("Error during range allocation: {e}");
+ MemoryTrackerError::FailedToMap
+ })?;
+ self.add(region)
+ }
+
+ /// Allocates the address range for a const slice.
+ ///
+ /// # Safety
+ ///
+ /// Callers of this method need to ensure that the `range` is valid for mapping as read-only
+ /// data.
+ pub unsafe fn alloc_range_outside_main_memory(
+ &mut self,
+ range: &MemoryRange,
+ ) -> Result<MemoryRange> {
+ let region = MemoryRegion { range: range.clone(), mem_type: MemoryType::ReadOnly };
+ self.check_no_overlap(®ion)?;
+ self.page_table.map_rodata(&get_va_range(range)).map_err(|e| {
+ error!("Error during range allocation: {e}");
+ MemoryTrackerError::FailedToMap
+ })?;
+ self.add(region)
+ }
+
+ /// Allocate the address range for a mutable slice; returns None if failed.
+ pub fn alloc_range_mut(&mut self, range: &MemoryRange) -> Result<MemoryRange> {
+ let region = MemoryRegion { range: range.clone(), mem_type: MemoryType::ReadWrite };
+ self.check_allocatable(®ion)?;
+ self.page_table.map_data_dbm(&get_va_range(range)).map_err(|e| {
+ error!("Error during mutable range allocation: {e}");
+ MemoryTrackerError::FailedToMap
+ })?;
+ self.add(region)
+ }
+
+ /// Allocate the address range for a const slice; returns None if failed.
+ pub fn alloc(&mut self, base: usize, size: NonZeroUsize) -> Result<MemoryRange> {
+ self.alloc_range(&(base..(base + size.get())))
+ }
+
+ /// Allocate the address range for a mutable slice; returns None if failed.
+ pub fn alloc_mut(&mut self, base: usize, size: NonZeroUsize) -> Result<MemoryRange> {
+ self.alloc_range_mut(&(base..(base + size.get())))
+ }
+
+ /// Checks that the given range of addresses is within the MMIO region, and then maps it
+ /// appropriately.
+ pub fn map_mmio_range(&mut self, range: MemoryRange) -> Result<()> {
+ if !range.is_within(&self.mmio_range) {
+ return Err(MemoryTrackerError::OutOfRange);
+ }
+ if self.mmio_regions.iter().any(|r| range.overlaps(r)) {
+ return Err(MemoryTrackerError::Overlaps);
+ }
+ if self.mmio_regions.len() == self.mmio_regions.capacity() {
+ return Err(MemoryTrackerError::Full);
+ }
+
+ if get_mmio_guard().is_some() {
+ self.page_table.map_device_lazy(&get_va_range(&range)).map_err(|e| {
+ error!("Error during lazy MMIO device mapping: {e}");
+ MemoryTrackerError::FailedToMap
+ })?;
+ } else {
+ self.page_table.map_device(&get_va_range(&range)).map_err(|e| {
+ error!("Error during MMIO device mapping: {e}");
+ MemoryTrackerError::FailedToMap
+ })?;
+ }
+
+ if self.mmio_regions.try_push(range).is_some() {
+ return Err(MemoryTrackerError::Full);
+ }
+
+ Ok(())
+ }
+
+ /// Checks that the memory region meets the following criteria:
+ /// - It is within the range of the `MemoryTracker`.
+ /// - It does not overlap with any previously allocated regions.
+ /// - The `regions` ArrayVec has sufficient capacity to add it.
+ fn check_allocatable(&self, region: &MemoryRegion) -> Result<()> {
+ if !region.range.is_within(&self.total) {
+ return Err(MemoryTrackerError::OutOfRange);
+ }
+ self.check_no_overlap(region)
+ }
+
+ /// Checks that the given region doesn't overlap with any other previously allocated regions,
+ /// and that the regions ArrayVec has capacity to add it.
+ fn check_no_overlap(&self, region: &MemoryRegion) -> Result<()> {
+ if self.regions.iter().any(|r| region.range.overlaps(&r.range)) {
+ return Err(MemoryTrackerError::Overlaps);
+ }
+ if self.regions.len() == self.regions.capacity() {
+ return Err(MemoryTrackerError::Full);
+ }
+ Ok(())
+ }
+
+ fn add(&mut self, region: MemoryRegion) -> Result<MemoryRange> {
+ if self.regions.try_push(region).is_some() {
+ return Err(MemoryTrackerError::Full);
+ }
+
+ Ok(self.regions.last().unwrap().range.clone())
+ }
+
+ /// Unshares any MMIO region previously shared with the MMIO guard.
+ pub fn unshare_all_mmio(&mut self) -> Result<()> {
+ self.mmio_sharer.unshare_all();
+
+ Ok(())
+ }
+
+ /// Initialize the shared heap to dynamically share memory from the global allocator.
+ pub fn init_dynamic_shared_pool(&mut self, granule: usize) -> Result<()> {
+ const INIT_CAP: usize = 10;
+
+ let previous = SHARED_MEMORY.lock().replace(MemorySharer::new(granule, INIT_CAP));
+ if previous.is_some() {
+ return Err(MemoryTrackerError::SharedMemorySetFailure);
+ }
+
+ SHARED_POOL
+ .set(Box::new(LockedFrameAllocator::new()))
+ .map_err(|_| MemoryTrackerError::SharedPoolSetFailure)?;
+
+ Ok(())
+ }
+
+ /// Initialize the shared heap from a static region of memory.
+ ///
+ /// Some hypervisors such as Gunyah do not support a MemShare API for guest
+ /// to share its memory with host. Instead they allow host to designate part
+ /// of guest memory as "shared" ahead of guest starting its execution. The
+ /// shared memory region is indicated in swiotlb node. On such platforms use
+ /// a separate heap to allocate buffers that can be shared with host.
+ pub fn init_static_shared_pool(&mut self, range: Range<usize>) -> Result<()> {
+ let size = NonZeroUsize::new(range.len()).unwrap();
+ let range = self.alloc_mut(range.start, size)?;
+ let shared_pool = LockedFrameAllocator::<32>::new();
+
+ shared_pool.lock().insert(range);
+
+ SHARED_POOL
+ .set(Box::new(shared_pool))
+ .map_err(|_| MemoryTrackerError::SharedPoolSetFailure)?;
+
+ Ok(())
+ }
+
+ /// Initialize the shared heap to use heap memory directly.
+ ///
+ /// When running on "non-protected" hypervisors which permit host direct accesses to guest
+ /// memory, there is no need to perform any memory sharing and/or allocate buffers from a
+ /// dedicated region so this function instructs the shared pool to use the global allocator.
+ pub fn init_heap_shared_pool(&mut self) -> Result<()> {
+ // As MemorySharer only calls MEM_SHARE methods if the hypervisor supports them, internally
+ // using init_dynamic_shared_pool() on a non-protected platform will make use of the heap
+ // without any actual "dynamic memory sharing" taking place and, as such, the granule may
+ // be set to the one of the global_allocator i.e. a byte.
+ self.init_dynamic_shared_pool(size_of::<u8>())
+ }
+
+ /// Unshares any memory that may have been shared.
+ pub fn unshare_all_memory(&mut self) {
+ drop(SHARED_MEMORY.lock().take());
+ }
+
+ /// Handles translation fault for blocks flagged for lazy MMIO mapping by enabling the page
+ /// table entry and MMIO guard mapping the block. Breaks apart a block entry if required.
+ pub(crate) fn handle_mmio_fault(&mut self, addr: VirtualAddress) -> Result<()> {
+ let shared_range = self.mmio_sharer.share(addr)?;
+ self.map_lazy_mmio_as_valid(&shared_range)?;
+
+ Ok(())
+ }
+
+ /// Modify the PTEs corresponding to a given range from (invalid) "lazy MMIO" to valid MMIO.
+ ///
+ /// Returns an error if any PTE in the range is not an invalid lazy MMIO mapping.
+ fn map_lazy_mmio_as_valid(&mut self, page_range: &VaRange) -> Result<()> {
+ // This must be safe and free from break-before-make (BBM) violations, given that the
+ // initial lazy mapping has the valid bit cleared, and each newly created valid descriptor
+ // created inside the mapping has the same size and alignment.
+ self.page_table
+ .modify_range(page_range, &|_: &VaRange, desc: &mut Descriptor, _: usize| {
+ let flags = desc.flags().expect("Unsupported PTE flags set");
+ if flags.contains(MMIO_LAZY_MAP_FLAG) && !flags.contains(Attributes::VALID) {
+ desc.modify_flags(Attributes::VALID, Attributes::empty());
+ Ok(())
+ } else {
+ Err(())
+ }
+ })
+ .map_err(|_| MemoryTrackerError::InvalidPte)
+ }
+
+ /// Flush all memory regions marked as writable-dirty.
+ fn flush_dirty_pages(&mut self) -> Result<()> {
+ // Collect memory ranges for which dirty state is tracked.
+ let writable_regions =
+ self.regions.iter().filter(|r| r.mem_type == MemoryType::ReadWrite).map(|r| &r.range);
+ // Execute a barrier instruction to ensure all hardware updates to the page table have been
+ // observed before reading PTE flags to determine dirty state.
+ dsb!("ish");
+ // Now flush writable-dirty pages in those regions.
+ for range in writable_regions.chain(self.payload_range.as_ref().into_iter()) {
+ self.page_table
+ .walk_range(&get_va_range(range), &flush_dirty_range)
+ .map_err(|_| MemoryTrackerError::FlushRegionFailed)?;
+ }
+ Ok(())
+ }
+
+ /// Handles permission fault for read-only blocks by setting writable-dirty state.
+ /// In general, this should be called from the exception handler when hardware dirty
+ /// state management is disabled or unavailable.
+ pub(crate) fn handle_permission_fault(&mut self, addr: VirtualAddress) -> Result<()> {
+ self.page_table
+ .modify_range(&(addr..addr + 1).into(), &mark_dirty_block)
+ .map_err(|_| MemoryTrackerError::SetPteDirtyFailed)
+ }
+}
+
+impl Drop for MemoryTracker {
+ fn drop(&mut self) {
+ set_dbm_enabled(false);
+ self.flush_dirty_pages().unwrap();
+ self.unshare_all_memory();
+ }
+}
diff --git a/libs/libvmbase/src/memory/util.rs b/libs/libvmbase/src/memory/util.rs
index e9f867f..cfb0fa7 100644
--- a/libs/libvmbase/src/memory/util.rs
+++ b/libs/libvmbase/src/memory/util.rs
@@ -14,9 +14,8 @@
//! Utility functions for memory management.
-use crate::read_sysreg;
+use crate::arch::flush_region;
use crate::util::unchecked_align_down;
-use core::arch::asm;
use core::ptr::NonNull;
use zeroize::Zeroize;
@@ -36,38 +35,6 @@
/// The page size in bytes assumed by vmbase - 4 KiB.
pub const PAGE_SIZE: usize = SIZE_4KB;
-/// Reads the number of words in the smallest cache line of all the data caches and unified caches.
-#[inline]
-pub fn min_dcache_line_size() -> usize {
- const DMINLINE_SHIFT: usize = 16;
- const DMINLINE_MASK: usize = 0xf;
- let ctr_el0 = read_sysreg!("ctr_el0");
-
- // DminLine: log2 of the number of words in the smallest cache line of all the data caches.
- let dminline = (ctr_el0 >> DMINLINE_SHIFT) & DMINLINE_MASK;
-
- 1 << dminline
-}
-
-/// Flush `size` bytes of data cache by virtual address.
-#[inline]
-pub(super) fn flush_region(start: usize, size: usize) {
- let line_size = min_dcache_line_size();
- let end = start + size;
- let start = unchecked_align_down(start, line_size);
-
- for line in (start..end).step_by(line_size) {
- // SAFETY: Clearing cache lines shouldn't have Rust-visible side effects.
- unsafe {
- asm!(
- "dc cvau, {x}",
- x = in(reg) line,
- options(nomem, nostack, preserves_flags),
- )
- }
- }
-}
-
/// Flushes the slice to the point of unification.
#[inline]
pub fn flush(reg: &[u8]) {
diff --git a/libs/libvmbase/src/util.rs b/libs/libvmbase/src/util.rs
index e52ac8e..6142cb3 100644
--- a/libs/libvmbase/src/util.rs
+++ b/libs/libvmbase/src/util.rs
@@ -17,15 +17,6 @@
use aarch64_paging::paging::MemoryRegion;
use core::ops::Range;
-/// Flatten [[T; N]] into &[T]
-/// TODO: use slice::flatten when it graduates from experimental
-pub fn flatten<T, const N: usize>(original: &[[T; N]]) -> &[T] {
- // SAFETY: no overflow because original (whose size is len()*N) is already in memory
- let len = original.len() * N;
- // SAFETY: [T] has the same layout as [T;N]
- unsafe { core::slice::from_raw_parts(original.as_ptr().cast(), len) }
-}
-
/// Computes the largest multiple of the provided alignment smaller or equal to the address.
///
/// Note: the result is undefined if alignment isn't a power of two.
diff --git a/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/DebianServiceImpl.java b/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/DebianServiceImpl.java
index dcc8152..61679f2 100644
--- a/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/DebianServiceImpl.java
+++ b/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/DebianServiceImpl.java
@@ -28,7 +28,7 @@
import io.grpc.stub.StreamObserver;
-class DebianServiceImpl extends DebianServiceGrpc.DebianServiceImplBase {
+final class DebianServiceImpl extends DebianServiceGrpc.DebianServiceImplBase {
public static final String TAG = "DebianService";
private final DebianServiceCallback mCallback;
@@ -79,6 +79,8 @@
private static native void runForwarderHost(int cid, ForwarderHostCallback callback);
+ public static native void terminateForwarderHost();
+
protected interface DebianServiceCallback {
void onIpAddressAvailable(String ipAddr);
}
diff --git a/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/InstallUtils.java b/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/InstallUtils.java
index f5cc912..57691bf 100644
--- a/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/InstallUtils.java
+++ b/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/InstallUtils.java
@@ -20,6 +20,8 @@
import android.os.FileUtils;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
+
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
@@ -64,6 +66,7 @@
}
}
+ @VisibleForTesting
public static void deleteInstallation(Context context) {
FileUtils.deleteContentsAndDir(getInternalStorageDir(context));
}
diff --git a/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/VmLauncherService.java b/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/VmLauncherService.java
index f672b7b..2bd85e1 100644
--- a/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/VmLauncherService.java
+++ b/libs/vm_launcher_lib/java/com/android/virtualization/vmlauncher/VmLauncherService.java
@@ -171,38 +171,36 @@
return new ServerCall.Listener<ReqT>() {};
}
};
- new Thread(
- () -> {
- try {
- // TODO(b/372666638): gRPC for java doesn't support vsock for now.
- int port = 0;
- mServer =
- OkHttpServerBuilder.forPort(
- port, InsecureServerCredentials.create())
- .intercept(interceptor)
- .addService(new DebianServiceImpl(this))
- .build()
- .start();
+ try {
+ // TODO(b/372666638): gRPC for java doesn't support vsock for now.
+ int port = 0;
+ mServer =
+ OkHttpServerBuilder.forPort(port, InsecureServerCredentials.create())
+ .intercept(interceptor)
+ .addService(new DebianServiceImpl(this))
+ .build()
+ .start();
+ } catch (IOException e) {
+ Log.d(TAG, "grpc server error", e);
+ return;
+ }
- // TODO(b/373533555): we can use mDNS for that.
- String debianServicePortFileName = "debian_service_port";
- File debianServicePortFile =
- new File(getFilesDir(), debianServicePortFileName);
- try (FileOutputStream writer =
- new FileOutputStream(debianServicePortFile)) {
- writer.write(String.valueOf(mServer.getPort()).getBytes());
- } catch (IOException e) {
- Log.d(TAG, "cannot write grpc port number", e);
- }
- } catch (IOException e) {
- Log.d(TAG, "grpc server error", e);
- }
- })
- .start();
+ mExecutorService.execute(
+ () -> {
+ // TODO(b/373533555): we can use mDNS for that.
+ String debianServicePortFileName = "debian_service_port";
+ File debianServicePortFile = new File(getFilesDir(), debianServicePortFileName);
+ try (FileOutputStream writer = new FileOutputStream(debianServicePortFile)) {
+ writer.write(String.valueOf(mServer.getPort()).getBytes());
+ } catch (IOException e) {
+ Log.d(TAG, "cannot write grpc port number", e);
+ }
+ });
}
private void stopDebianServer() {
if (mServer != null) {
+ DebianServiceImpl.terminateForwarderHost();
mServer.shutdown();
}
}
diff --git a/tests/ComposBenchmarkApp/src/java/com/android/compos/benchmark/ComposBenchmark.java b/tests/ComposBenchmarkApp/src/java/com/android/compos/benchmark/ComposBenchmark.java
index 3f5ff20..cde5393 100644
--- a/tests/ComposBenchmarkApp/src/java/com/android/compos/benchmark/ComposBenchmark.java
+++ b/tests/ComposBenchmarkApp/src/java/com/android/compos/benchmark/ComposBenchmark.java
@@ -130,7 +130,8 @@
for (int round = 0; round < ROUND_COUNT; ++round) {
- GetMetricsRunnable getMetricsRunnable = new GetMetricsRunnable("crosvm", processMemory);
+ GetMetricsRunnable getMetricsRunnable =
+ new GetMetricsRunnable("crosvm_ComposdTest", processMemory);
Thread threadGetMetrics = new Thread(getMetricsRunnable);
threadGetMetrics.start();
diff --git a/tests/Terminal/Android.bp b/tests/Terminal/Android.bp
index cafbe93..029fbea 100644
--- a/tests/Terminal/Android.bp
+++ b/tests/Terminal/Android.bp
@@ -20,5 +20,8 @@
platform_apis: true,
test_suites: ["general-tests"],
instrumentation_for: "VmTerminalApp",
- data: ["TerminalAppTests-preparer.sh"],
+ data: [
+ "TerminalAppTests-helper.sh",
+ "TerminalAppTests-downloader.sh",
+ ],
}
diff --git a/tests/Terminal/AndroidTest.xml b/tests/Terminal/AndroidTest.xml
index 262421c..c1f33b9 100644
--- a/tests/Terminal/AndroidTest.xml
+++ b/tests/Terminal/AndroidTest.xml
@@ -26,8 +26,22 @@
<option name="force-root" value="true"/>
</target_preparer>
+ <!-- Download the VM image and push it to the device -->
<target_preparer class="com.android.tradefed.targetprep.RunHostScriptTargetPreparer">
- <option name="script-file" value="TerminalAppTests-preparer.sh" />
+ <option name="script-file" value="TerminalAppTests-downloader.sh" />
+ </target_preparer>
+
+ <!-- Push the helper script to the device -->
+ <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+ <option name="push" value="TerminalAppTests-helper.sh->/data/local/tmp/helper.sh"/>
+ <option name="post-push" value="chmod 755 /data/local/tmp/helper.sh"/>
+ <option name="cleanup" value="true"/>
+ </target_preparer>
+
+ <!-- Run the helper script to enable/disable the Terminal app before and after the test run -->
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+ <option name="run-command" value="/data/local/tmp/helper.sh setup"/>
+ <option name="teardown-command" value="/data/local/tmp/helper.sh teardown"/>
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
diff --git a/tests/Terminal/TerminalAppTests-preparer.sh b/tests/Terminal/TerminalAppTests-downloader.sh
similarity index 73%
rename from tests/Terminal/TerminalAppTests-preparer.sh
rename to tests/Terminal/TerminalAppTests-downloader.sh
index 6022d7d..37be591 100644
--- a/tests/Terminal/TerminalAppTests-preparer.sh
+++ b/tests/Terminal/TerminalAppTests-downloader.sh
@@ -19,16 +19,12 @@
serial=${ANDROID_SERIAL}
user=$(adb -s ${serial} shell am get-current-user)
-# Enable the terminal app
-package_name=$(adb -s ${serial} shell pm list package virtualization.terminal | cut -d ':' -f 2)
-adb -s ${serial} shell pm enable --user ${user} ${package_name}
-
# Identify file to download
arch=$(adb -s ${serial} shell getprop ro.bionic.arch)
if [ ${arch} == "arm64" ]; then
- src=https://github.com/ikicha/debian_ci/releases/download/release_aarch64/images.tar.gz
+ src=https://dl.google.com/android/ferrochrome/latest/aarch64/images.tar.gz
else
- src=https://github.com/ikicha/debian_ci/releases/download/release_x86_64/images.tar.gz
+ src=https://dl.google.com/android/ferrochrome/latest/x86_64/images.tar.gz
fi
# Download
diff --git a/tests/Terminal/TerminalAppTests-helper.sh b/tests/Terminal/TerminalAppTests-helper.sh
new file mode 100644
index 0000000..b9f2b08
--- /dev/null
+++ b/tests/Terminal/TerminalAppTests-helper.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+# Copyright 2024 Google Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+user=$(am get-current-user)
+package_name=$(pm list package virtualization.terminal | cut -d ':' -f 2)
+
+if [ $1 == "setup" ]; then
+ pm enable --user ${user} ${package_name}
+elif [ $1 == "teardown" ]; then
+ pm clear --user ${user} ${package_name}
+ pm disable --user ${user} ${package_name}
+ rm -rf /data/media/${user}/linux
+else
+ echo Unsupported command: $1
+ exit 1
+fi