mirror of
https://github.com/xoureldeen/Vectras-VM-Android.git
synced 2026-04-28 06:19:49 +00:00
commit
dfe2a7bce7
10 changed files with 183 additions and 61 deletions
|
|
@ -12,8 +12,8 @@ android {
|
|||
applicationId "com.vectras.vm"
|
||||
minSdk minApi
|
||||
targetSdk targetApi
|
||||
versionCode 88
|
||||
versionName "3.8.4"
|
||||
versionCode 89
|
||||
versionName "3.8.5"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
multiDexEnabled true
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ import com.vectras.vm.settings.X11DisplaySettingsActivity;
|
|||
import com.vectras.vm.utils.DialogUtils;
|
||||
import com.vectras.vm.utils.FileUtils;
|
||||
import com.vectras.vm.utils.JSONUtils;
|
||||
import com.vectras.vm.utils.ProgressDialog;
|
||||
import com.vectras.vm.utils.TextUtils;
|
||||
import com.vectras.vm.utils.UIUtils;
|
||||
import com.vectras.vterm.Terminal;
|
||||
|
|
@ -222,6 +223,18 @@ public class VMManager {
|
|||
return position == -1 ? addToVMList(vmConfigMap, Objects.requireNonNull(vmConfigMap.get("vmID")).toString()) : replaceToVMList(position, "", vmConfigMap);
|
||||
}
|
||||
|
||||
public static boolean isVMHidden(String vmPath) {
|
||||
return new File(vmPath).getName().startsWith("_");
|
||||
}
|
||||
|
||||
public static boolean hideVM(String vmId) {
|
||||
return FileUtils.rename(AppConfig.vmFolder + vmId, "_" + vmId);
|
||||
}
|
||||
public static boolean unHideVM(String vmPath) {
|
||||
return FileUtils.rename(vmPath, new File(vmPath).getName().replace("_", ""));
|
||||
}
|
||||
|
||||
|
||||
public static boolean createNewVM(String name, String thumbnail, String drive, String arch, String cdrom, String params, String vmID, int port) {
|
||||
HashMap<String, Object> vmConfigMap = new HashMap<>();
|
||||
vmConfigMap.put("imgName", name);
|
||||
|
|
@ -267,39 +280,35 @@ public class VMManager {
|
|||
public static void deleteVMDialog(String _vmName, int _position, Activity _activity) {
|
||||
DialogUtils.threeDialog(_activity, _activity.getString(R.string.remove) + " " + _vmName, _activity.getString(R.string.remove_vm_content), _activity.getString(R.string.remove_and_do_not_keep_files), _activity.getString(R.string.remove_but_keep_files), _activity.getString(R.string.cancel), true, R.drawable.delete_24px, true,
|
||||
() -> {
|
||||
View progressView = LayoutInflater.from(_activity).inflate(R.layout.dialog_progress_style, null);
|
||||
TextView progress_text = progressView.findViewById(R.id.progress_text);
|
||||
progress_text.setText(_activity.getString(R.string.just_a_moment));
|
||||
AlertDialog progressDialog = new MaterialAlertDialogBuilder(_activity, R.style.CenteredDialogTheme)
|
||||
.setView(progressView)
|
||||
.setCancelable(false)
|
||||
.create();
|
||||
ProgressDialog progressDialog = new ProgressDialog(_activity);
|
||||
progressDialog.setText(_activity.getString(R.string.just_a_moment));
|
||||
progressDialog.show();
|
||||
|
||||
new Thread(() -> {
|
||||
isKeptSomeFiles = false;
|
||||
deleteVm(_activity, _position, false);
|
||||
boolean result = deleteVm(_activity, _position, false);
|
||||
_activity.runOnUiThread(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||
progressDialog.dismiss();
|
||||
progressDialog.reset();
|
||||
MainActivity.refeshVMListNow();
|
||||
if (!result) {
|
||||
DialogUtils.oopsDialog(_activity, _activity.getString(R.string.an_error_occurred_while_deleting_the_vm));
|
||||
} else if (isKeptSomeFiles) {
|
||||
DialogUtils.oneDialog(_activity, _activity.getString(R.string.done), _activity.getString(R.string.the_vm_files_were_retained_because_they_are_still_being_used_elsewhere), R.drawable.check_24px);
|
||||
}
|
||||
}, 500));
|
||||
}).start();
|
||||
},
|
||||
() -> {
|
||||
View progressView = LayoutInflater.from(_activity).inflate(R.layout.dialog_progress_style, null);
|
||||
TextView progress_text = progressView.findViewById(R.id.progress_text);
|
||||
progress_text.setText(_activity.getString(R.string.just_a_moment));
|
||||
AlertDialog progressDialog = new MaterialAlertDialogBuilder(_activity, R.style.CenteredDialogTheme)
|
||||
.setView(progressView)
|
||||
.setCancelable(false)
|
||||
.create();
|
||||
ProgressDialog progressDialog = new ProgressDialog(_activity);
|
||||
progressDialog.setText(_activity.getString(R.string.just_a_moment));
|
||||
progressDialog.show();
|
||||
|
||||
new Thread(() -> {
|
||||
deleteVm(_activity, _position, true);
|
||||
boolean result = deleteVm(_activity, _position, true);
|
||||
_activity.runOnUiThread(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||
progressDialog.dismiss();
|
||||
progressDialog.reset();
|
||||
MainActivity.refeshVMListNow();
|
||||
if (!result) DialogUtils.oopsDialog(_activity, _activity.getString(R.string.an_error_occurred_while_deleting_the_vm));
|
||||
}, 500));
|
||||
}).start();
|
||||
},
|
||||
|
|
@ -307,34 +316,38 @@ public class VMManager {
|
|||
null);
|
||||
}
|
||||
|
||||
public static void deleteVm(Context context, int position, boolean isKeepFiles) {
|
||||
if (!JSONUtils.isValidVmList()) return;
|
||||
public static boolean deleteVm(Context context, int position, boolean isKeepFiles) {
|
||||
if (!JSONUtils.isValidVmList()) return false;
|
||||
String vmList = FileUtils.readFromFile(context, new File(AppConfig.maindirpath + "roms-data.json"));
|
||||
JsonArray arr = JsonParser.parseString(vmList).getAsJsonArray();
|
||||
if (position < 0 || position > arr.size() - 1) return;
|
||||
if (position < 0 || position > arr.size() - 1) return false;
|
||||
JsonObject obj = arr.get(position).getAsJsonObject();
|
||||
String vmId = obj.has("vmID") ? obj.get("vmID").getAsString() : null;
|
||||
arr.remove(position);
|
||||
|
||||
vmList = new Gson().toJson(arr);
|
||||
|
||||
if (vmId == null || vmId.isEmpty()) return;
|
||||
if (vmId == null || vmId.isEmpty()) return false;
|
||||
|
||||
boolean isCompleted;
|
||||
if (isKeepFiles) {
|
||||
FileUtils.rename(AppConfig.vmFolder + vmId, "_" + vmId);
|
||||
if (isVmFilesInUse(vmId, vmList)) {
|
||||
isCompleted = hideVM(vmId);
|
||||
if (isCompleted && isVmFilesInUse(vmId, vmList)) {
|
||||
vmList = vmList.replace(AppConfig.vmFolder + vmId, AppConfig.vmFolder + "_" + vmId);
|
||||
}
|
||||
} else {
|
||||
if (isVmFilesInUse(vmId, vmList)) {
|
||||
isKeptSomeFiles = true;
|
||||
FileUtils.rename(AppConfig.vmFolder + vmId, "_" + vmId);
|
||||
vmList = vmList.replace(AppConfig.vmFolder + vmId, AppConfig.vmFolder + "_" + vmId);
|
||||
isCompleted = hideVM(vmId);
|
||||
if (isCompleted) vmList = vmList.replace(AppConfig.vmFolder + vmId, AppConfig.vmFolder + "_" + vmId);
|
||||
} else {
|
||||
FileUtils.delete(new File(AppConfig.vmFolder + vmId));
|
||||
isCompleted = FileUtils.delete(new File(AppConfig.vmFolder + vmId));
|
||||
}
|
||||
}
|
||||
|
||||
FileUtils.writeToFile(AppConfig.maindirpath, "roms-data.json", vmList);
|
||||
if (isCompleted) FileUtils.writeToFile(AppConfig.maindirpath, "roms-data.json", vmList);
|
||||
|
||||
return isCompleted;
|
||||
}
|
||||
|
||||
public static int restoreAll() {
|
||||
|
|
@ -344,11 +357,11 @@ public class VMManager {
|
|||
if (vmFolders == null) return 0;
|
||||
List<String> restoredVms = new ArrayList<>();
|
||||
for (File f : vmFolders) {
|
||||
if (f.getName().startsWith("_") && isFileExists(f.getAbsolutePath() + "/rom-data.json")) {
|
||||
if (isVMHidden(f.getAbsolutePath()) && isFileExists(f.getAbsolutePath() + "/rom-data.json")) {
|
||||
String vmConfig = FileUtils.readAFile(f.getAbsolutePath() + "/rom-data.json");
|
||||
if (JSONUtils.isValidFromString(vmConfig)) {
|
||||
if (f.getName().startsWith("_"))
|
||||
FileUtils.rename(f.getAbsolutePath(), f.getName().replace("_", ""));
|
||||
if (isVMHidden(f.getAbsolutePath()))
|
||||
unHideVM(f.getAbsolutePath());
|
||||
arr.add(JsonParser.parseString(vmConfig));
|
||||
restoredVms.add(f.getName().replaceAll("_", ""));
|
||||
}
|
||||
|
|
@ -374,7 +387,7 @@ public class VMManager {
|
|||
if (vmFolders == null) return 0;
|
||||
for (File f : vmFolders) {
|
||||
if (!isVmFilesInUse(f.getName(), vmList)) {
|
||||
if (f.getName().startsWith("_")) {
|
||||
if (isVMHidden(f.getAbsolutePath())) {
|
||||
FileUtils.delete(new File(f.getAbsolutePath()));
|
||||
cleared++;
|
||||
} else if (!isFileExists(f.getAbsolutePath() + "/rom-data.json")) {
|
||||
|
|
@ -490,9 +503,7 @@ public class VMManager {
|
|||
|
||||
_startRepeat++;
|
||||
if (_startRepeat == _filelist.size()) {
|
||||
if (restoredVMs > 0) {
|
||||
FileUtils.writeToFile(AppConfig.maindirpath, "roms-data.json", arr.toString());
|
||||
}
|
||||
FileUtils.writeToFile(AppConfig.maindirpath, "roms-data.json", restoredVMs > 0 ? arr.toString() : "[]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import static com.vectras.vm.VectrasApp.getApp;
|
|||
import android.annotation.SuppressLint;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ public class RomStoreFragment extends Fragment {
|
|||
|
||||
mAdapter.submitList(data);
|
||||
|
||||
SharedData.dataRomStore.clear();
|
||||
SharedData.dataRomStore.addAll(dataRoms);
|
||||
romStoreCallToHomeListener.updateSearchStatus(true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ public class SoftwareStoreFragment extends Fragment {
|
|||
|
||||
mAdapter.submitList(data);
|
||||
|
||||
SharedData.dataSoftwareStore.clear();
|
||||
SharedData.dataSoftwareStore.addAll(dataSoftware);
|
||||
softwareStoreCallToHomeListener.updateSearchStatus(true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ public class DialogUtils {
|
|||
oneDialog(context, title, message, context.getString(R.string.ok), iconid != -1, iconid, true, null, null);
|
||||
}
|
||||
|
||||
public static void oopsDialog(Context context, String message) {
|
||||
oneDialog(context, context.getString(R.string.oops), message, R.drawable.error_96px);
|
||||
}
|
||||
|
||||
public static void oneDialog(Context context, String _title, String _message, String _textPositiveButton, boolean _isicon, int _iconid, boolean _cancel, Runnable _onPositive, Runnable _onDismiss) {
|
||||
if (!isAllowShow(context)) return;
|
||||
|
||||
|
|
|
|||
102
app/src/main/java/com/vectras/vm/utils/ProgressDialog.java
Normal file
102
app/src/main/java/com/vectras/vm/utils/ProgressDialog.java
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
package com.vectras.vm.utils;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Build;
|
||||
import android.view.LayoutInflater;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.vectras.vm.R;
|
||||
import com.vectras.vm.databinding.DialogProgressStyleBinding;
|
||||
|
||||
public class ProgressDialog {
|
||||
|
||||
private final Activity activity;
|
||||
private AlertDialog dialog;
|
||||
private DialogProgressStyleBinding binding;
|
||||
private String text;
|
||||
private Integer progress;
|
||||
private Integer max;
|
||||
private Boolean isIndeterminate;
|
||||
|
||||
public ProgressDialog(Activity activity) {
|
||||
this.activity = activity;
|
||||
}
|
||||
|
||||
public void show() {
|
||||
if (DialogUtils.isAllowShow(activity)) {
|
||||
if (dialog != null && dialog.isShowing()) return;
|
||||
|
||||
binding = DialogProgressStyleBinding.inflate(LayoutInflater.from(activity));
|
||||
|
||||
if (text != null) binding.progressText.setText(text);
|
||||
|
||||
if (progress != null) {
|
||||
binding.progressBar.setIndeterminate(false);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 24) {
|
||||
binding.progressBar.setProgress(progress, true);
|
||||
} else {
|
||||
binding.progressBar.setProgress(progress);
|
||||
}
|
||||
}
|
||||
|
||||
if (max != null) binding.progressBar.setMax(max);
|
||||
|
||||
if (isIndeterminate != null) binding.progressBar.setIndeterminate(isIndeterminate);
|
||||
|
||||
dialog = new MaterialAlertDialogBuilder(activity, R.style.CenteredDialogTheme)
|
||||
.setView(binding.getRoot())
|
||||
.setCancelable(false)
|
||||
.create();
|
||||
dialog.show();
|
||||
}
|
||||
}
|
||||
|
||||
public void setText(String text) {
|
||||
this.text = text;
|
||||
if (binding != null) binding.progressText.setText(text);
|
||||
}
|
||||
|
||||
public void setProgress(int progress) {
|
||||
this.progress = Math.max(progress, 0);
|
||||
if (binding != null) {
|
||||
binding.progressBar.setIndeterminate(false);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 24) {
|
||||
binding.progressBar.setProgress(this.progress, true);
|
||||
} else {
|
||||
binding.progressBar.setProgress(this.progress);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setMax(int max) {
|
||||
this.max = Math.max(max, 0);
|
||||
if (binding != null) binding.progressBar.setMax(this.max);
|
||||
}
|
||||
|
||||
public void setIndeterminate(boolean isIndeterminate) {
|
||||
this.isIndeterminate = isIndeterminate;
|
||||
if (binding != null) binding.progressBar.setIndeterminate(isIndeterminate);
|
||||
}
|
||||
|
||||
public boolean isShowing() {
|
||||
return dialog != null && dialog.isShowing();
|
||||
}
|
||||
|
||||
public void dismiss() {
|
||||
DialogUtils.safeDismiss(activity, dialog);
|
||||
binding = null;
|
||||
dialog = null;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
dismiss();
|
||||
text = null;
|
||||
progress = null;
|
||||
max = null;
|
||||
isIndeterminate = null;
|
||||
}
|
||||
}
|
||||
|
|
@ -269,7 +269,7 @@
|
|||
<string name="shared_folder_is_not_used_because_i386_does_not_support_it">Thư mục được chia sẻ không được sử dụng vì i386 không hỗ trợ nó.</string>
|
||||
<string name="use_uefi_for_x64_only">Dùng UEFI (chỉ x64)</string>
|
||||
<string name="remove_and_do_not_keep_files">Xoá và không giữ các tệp</string>
|
||||
<string name="remove_but_keep_files">Xoá và ẫn giữ các tệp</string>
|
||||
<string name="remove_but_keep_files">Xoá và giữ các tệp</string>
|
||||
<string name="remove_vm_content">Bạn có muốn xoá nó không? Bạn có thể chọn giữ hoặc không giữ các tệp.</string>
|
||||
<string name="general">Chung</string>
|
||||
<string name="personalization">Cá nhân hoá</string>
|
||||
|
|
@ -372,13 +372,13 @@
|
|||
<string name="port_qemu">Cổng:</string>
|
||||
<string name="running_vm_with_vnc_server_content">Bạn có thể tắt máy ảo này bằng cách nhấp vào nút Dừng trong Trình giám sát Hệ thống. Để điều khiển nó, hãy kết nối với cổng này:</string>
|
||||
<string name="action_needed">Cần hành động</string>
|
||||
<string name="repair_vm_list_content">Dữ liệu về các máy ảo đã bị hỏng và cần được sửa chữa.</string>
|
||||
<string name="repair_vm_list_content">Danh sách máy ảo đã bị hỏng và cần được sửa chữa.</string>
|
||||
<string name="start_repair">Bắt đầu sửa</string>
|
||||
<string name="not_enough_storage_to_set_up_content">Thiết bị của bạn không đủ dung lượng lưu trữ để thiết lập. Vui lòng giải phóng dung lượng và thử lại sau.</string>
|
||||
<string name="no_signal">Sao không thấy gì vậy nhỉ?</string>
|
||||
<string name="tap_to_try_again">Chạm để thử lại.</string>
|
||||
<string name="force_refresh">Buộc làm mới</string>
|
||||
<string name="force_refresh_vnc_description">Màn hình VNC sẽ khởi động lại mỗi khi có thay đổi, điều này giúp khắc phục sự cố.</string>
|
||||
<string name="force_refresh_vnc_description">Màn hình VNC sẽ khởi động lại mỗi khi có thay đổi, điều này giúp khắc phục một số sự cố.</string>
|
||||
<string name="settings_for_vnc">Các cài đặt cho VNC.</string>
|
||||
<string name="imported">Đã nhập</string>
|
||||
<string name="file_imported_successfully">Tệp đã được nhập.</string>
|
||||
|
|
@ -409,10 +409,10 @@
|
|||
<string name="edit">Sửa</string>
|
||||
<string name="importing">Đang nhập…</string>
|
||||
<string name="completed">Đã xong</string>
|
||||
<string name="please_stay_here">Vui lòng ở lại đây.</string>
|
||||
<string name="please_stay_here">Đừng rời đi!</string>
|
||||
<string name="exporting">Đang xuất…</string>
|
||||
<string name="developers">Các nhà phát triển</string>
|
||||
<string name="our_social">Các mạng xã hội của chúng tôi</string>
|
||||
<string name="our_social">Các mạng xã hội</string>
|
||||
<string name="like">Thích</string>
|
||||
<string name="liked">Đã thích</string>
|
||||
<string name="unit_of_view">lượt xem</string>
|
||||
|
|
@ -424,8 +424,8 @@
|
|||
<string name="smart_size_calculation_description">Nếu cần, hãy bỏ qua bước tính toán kích thước khi nhập rom để quá trình nhập diễn ra nhanh hơn, nhưng tiến trình nhập sẽ không được hiển thị.</string>
|
||||
<string name="cyclic_redundancy_check">Kiểm tra dư thừa tuần hoàn</string>
|
||||
<string name="cyclic_redundancy_check_description">Chức năng này kiểm tra và phát hiện lỗi dữ liệu khi xuất rom, bạn có thể tắt nó đi để xuất nhanh hơn.</string>
|
||||
<string name="unable_to_connect_to_alpine_linux_server_content">Không thể kết nối đến máy chủ Alpine Linux hoặc máy chủ đang tạm thời ngừng hoạt động, vui lòng kiểm tra kết nối mạng, thử kết nối với máy chủ phản chiếu khác hoặc thử lại sau vài giờ.</string>
|
||||
<string name="system_files_installation_failed_content">Đã xảy ra lỗi trong quá trình cài đặt tập tin hệ thống. Bạn có thể thử gỡ cài đặt và cài đặt lại ứng dụng này để khắc phục sự cố.</string>
|
||||
<string name="unable_to_connect_to_alpine_linux_server_content">Thứ gì đó đã ngăn chúng ta kết nối đến máy chủ của Alpine Linux hoặc máy chủ đang ngủ rồi, vui lòng kiểm tra kết nối mạng, thử kết nối với máy chủ khác hoặc thử lại sau vài giờ.</string>
|
||||
<string name="system_files_installation_failed_content">Một con ốc đã rơi đâu mất khiến hệ thống không hoạt động được rồi! Bạn có thể thử gỡ cài đặt và cài đặt lại ứng dụng này để khắc phục sự cố.</string>
|
||||
<string name="copying_file">Đang sao chép tệp…</string>
|
||||
<string name="cdrom_hint">Đĩa quang (chỉ iso)</string>
|
||||
<string name="invalid_file">Tệp không hợp lệ</string>
|
||||
|
|
@ -433,21 +433,21 @@
|
|||
<string name="use_vnc">Dùng VNC</string>
|
||||
<string name="installing_system_files">Đang cài đặt hệ thống…</string>
|
||||
<string name="connecting">Đang kết nối…</string>
|
||||
<string name="how_do_you_want_to_install">Bạn muốn cài đặt bằng cái nào?</string>
|
||||
<string name="how_do_you_want_to_install_note">Tiêu chuẩn hoặc thủ công?</string>
|
||||
<string name="how_do_you_want_to_install">Bạn muốn cài đặt bằng cách nào?</string>
|
||||
<string name="how_do_you_want_to_install_note">Tiêu chuẩn hay thủ công?</string>
|
||||
<string name="standard">Tiêu chuẩn</string>
|
||||
<string name="standard_note">Phần mềm được đề xuất và quá trình cài đặt sẽ tự động cài đặt mọi thứ.</string>
|
||||
<string name="standard_note">Các gói được đề xuất và quá trình cài đặt sẽ tự động cài đặt mọi thứ.</string>
|
||||
<string name="custom">Thủ công</string>
|
||||
<string name="custom_note">Nếu bạn muốn tự chọn tệp bootstrap để cài đặt phiên bản Qemu mong muốn.</string>
|
||||
<string name="mirror_note">Chọn chiếc gương gần bạn nhất để thiết lập nhanh hơn.</string>
|
||||
<string name="custom_note">Nếu bạn muốn tự chọn tệp khởi động để cài đặt phiên bản Qemu mong muốn.</string>
|
||||
<string name="mirror_note">Chọn máy chủ gần bạn nhất để thiết lập nhanh hơn.</string>
|
||||
<string name="please_do_not_disconnect_the_network_this_may_take_a_few_minutes">Vui lòng không ngắt kết nối mạng. Quá trình này có thể mất vài phút.</string>
|
||||
<string name="something_went_wrong">Có gì đó sai sai</string>
|
||||
<string name="the_setup_could_not_be_completed_and_below_is_the_log">Quá trình cài đặt không thể hoàn tất và nhật ký lỗi được hiển thị bên dưới.</string>
|
||||
<string name="this_option_is_temporarily_unavailable_because_the_server_cannot_be_connected">Tùy chọn này hiện không khả dụng vì không thể kết nối với máy chủ.</string>
|
||||
<string name="vectras_vm_cannot_run_on_this_device">Vectras VM không thể hoạt động trên thiết bị này.</string>
|
||||
<string name="not_enough_storage_space">Không đủ không gian lưu trữ.</string>
|
||||
<string name="not_enough_storage_space">Nơi này quá chật chội rồi! Không còn đủ không gian lưu trữ.</string>
|
||||
<string name="there_are_no_logs">Không có nhập ký.</string>
|
||||
<string name="the_required_package_is_not_installed_content">Gói phần mềm cần thiết chưa được cài đặt, bạn cần cài đặt nó trước khi sử dụng tính năng này.</string>
|
||||
<string name="the_required_package_is_not_installed_content">Các gói cần thiết chưa được cài đặt, bạn cần cài đặt nó trước khi sử dụng tính năng này.</string>
|
||||
<string name="need_install_termux_x11_content">Ứng dụng Termux:X11 chưa được cài đặt, bạn cần cài đặt ứng dụng này để tiếp tục.</string>
|
||||
<string name="X11_display">Màn hình X11</string>
|
||||
<string name="settings_for_X11_display">Các cài đặt cho màn hình X11.</string>
|
||||
|
|
@ -459,7 +459,7 @@
|
|||
<string name="run_qemu_with_xterm">Chạy Qemu với Xterm</string>
|
||||
<string name="run_qemu_with_xterm_note">Giúp chạy các lệnh Qemu dễ dàng hơn mà không cần chuyển đổi.</string>
|
||||
<string name="quick_edit">Sửa nhanh</string>
|
||||
<string name="write_something">Hãy viết gì đó…</string>
|
||||
<string name="write_something">Hãy viết gì đó đi nào…</string>
|
||||
<string name="switch_to_vnc">Chuyển sang VNC</string>
|
||||
<string name="preferences">Tùy chọn</string>
|
||||
<string name="go_to_termux_x11_settings">Đến cài đặt Termux:X11.</string>
|
||||
|
|
@ -469,20 +469,20 @@
|
|||
<string name="software_and_driver">Phần mềm & trình điều khiển</string>
|
||||
<string name="shared_by">Được chia sẻ bởi</string>
|
||||
<string name="system_update">Cập nhật hệ thống</string>
|
||||
<string name="system_update_note">Đã có bản cập nhật hệ thống, hãy cập nhật ngay để có trải nghiệm đầy đủ.</string>
|
||||
<string name="system_update_note">Đã có bản cập nhật hệ thống, hãy cập nhật ngay để có trải nghiệm tốt hơn.</string>
|
||||
<string name="use_sdl">Dùng SDL</string>
|
||||
<string name="use_sdl_note">Hãy bật tùy chọn này nếu bạn muốn sử dụng 3dfx và chơi các game cổ điển (chỉ dành cho x86_64 và i386).</string>
|
||||
<string name="use_sdl_note">Hãy bật tùy chọn này nếu bạn muốn sử dụng 3dfx và chơi các trò chơi điện tử cổ điển (chỉ dành cho x86_64 và i386).</string>
|
||||
<string name="qemu_documentation">Tài liệu QEMU</string>
|
||||
<string name="you_need_to_switch_to_sdl_to_use_3dfx">Bạn cần chuyển sang SDL để sử dụng 3dfx.</string>
|
||||
<string name="device_manager">Quản lý thiết bị</string>
|
||||
<string name="show_in_folder">Xem trong thư mục</string>
|
||||
<string name="exit">Thoát</string>
|
||||
<string name="threedfx">3dfx</string>
|
||||
<string name="cpu_support_3dfx_content">CPU của thiết bị bạn hỗ trợ tăng tốc cho 3dfx. Tuy nhiên, nó có thể không ổn định hoặc không hoạt động.</string>
|
||||
<string name="cpu_support_3dfx_content">CPU của thiết bị bạn hỗ trợ tăng tốc cho 3dfx. Tuy nhiên, nó có hoạt động thật hay không thì hên xui.</string>
|
||||
<string name="cpu_not_support_3dfx_content">CPU của thiết bị của bạn không hỗ trợ tăng tốc cho 3dfx.</string>
|
||||
<string name="threedfx_is_not_available">3dfx không có sẵn.</string>
|
||||
<string name="refresh">Làm mới</string>
|
||||
<string name="last_crash_note">Chúng tôi rất xin lỗi về sự cố đã xảy ra và ứng dụng bị sập trước đó.</string>
|
||||
<string name="last_crash_note">Xin lỗi nhé! Cơn ngất xỉu đã đến quá bất ngờ.</string>
|
||||
<string name="show_virtual_mouse">Hiện chuột ảo</string>
|
||||
<string name="hide_virtual_mouse">Ẩn chuột ảo</string>
|
||||
<string name="this_bootstrap_file_is_invalid">Tệp khởi động này không hợp lệ.</string>
|
||||
|
|
@ -508,6 +508,8 @@
|
|||
<string name="adding_file_failed_content">Thêm tệp không thành công, vui lòng thử lại sau.</string>
|
||||
<string name="items_have_been_cleared">mục đã được dọn dẹp.</string>
|
||||
<string name="show_recycle_bin">Xem thùng rác</string>
|
||||
<string name="an_error_occurred_while_deleting_the_vm">Đã xảy ra lỗi khi xoá máy ảo.</string>
|
||||
<string name="the_vm_files_were_retained_because_they_are_still_being_used_elsewhere">Các tệp của máy ảo đã được giữ lại vì chúng vẫn còn được sử dụng ở nơi khác.</string>
|
||||
|
||||
|
||||
<!--======================TERMUX STRINGS====================-->
|
||||
|
|
|
|||
|
|
@ -517,6 +517,8 @@
|
|||
<string name="adding_file_failed_content">Adding file failed, please try again later.</string>
|
||||
<string name="items_have_been_cleared">items have been cleared.</string>
|
||||
<string name="show_recycle_bin">Show recycle bin</string>
|
||||
<string name="an_error_occurred_while_deleting_the_vm">An error occurred while deleting the virtual machine.</string>
|
||||
<string name="the_vm_files_were_retained_because_they_are_still_being_used_elsewhere">The virtual machine\'s files were retained because they are still being used elsewhere.</string>
|
||||
|
||||
|
||||
<!--======================TERMUX STRINGS====================-->
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@
|
|||
"url": "https://github.com/xoureldeen/Vectras-VM-Android/releases",
|
||||
"Message": "<h2>3.8.0</h2>\nBugs fixed.",
|
||||
"cancellable": true,
|
||||
"versionCodeBeta":"88",
|
||||
"versionNameBeta":"3.8.4",
|
||||
"versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5,3.5.6,3.5.7,3.5.8,3.5.9,3.6.1,3.6.2,3.6.3,3.6.4,3.6.5,3.6.6,3.6.7,3.6.8,3.6.9,3.7.1,3.7.2,3.7.3,3.7.4,3.7.5,3.7.6,3.7.7,3.7.8,3.7.9,3.8.0,3.8.1,3.8.2,3.8.3,3.8.4",
|
||||
"versionCodeBeta":"89",
|
||||
"versionNameBeta":"3.8.5",
|
||||
"versionNameBetas":"3.0.0,3.1.0,3.2.1,3.2.2,3.2.3,3.2.4,3.2.5,3.2.6,3.2.7,3.2.8,3.2.9,3.2.10,3.3.1,3.3.2,3.3.3,3.3.4,3.3.5,3.3.6,3.3.7,3.3.8,3.3.9,3.4.1,3.4.2,3.4.3,3.4.4,3.4.5,3.4.6,3.4.7,3.4.8,3.4.9,3.5.1,3.5.2,3.5.3,3.5.4,3.5.5,3.5.6,3.5.7,3.5.8,3.5.9,3.6.1,3.6.2,3.6.3,3.6.4,3.6.5,3.6.6,3.6.7,3.6.8,3.6.9,3.7.1,3.7.2,3.7.3,3.7.4,3.7.5,3.7.6,3.7.7,3.7.8,3.7.9,3.8.0,3.8.1,3.8.2,3.8.3,3.8.4,3.8.5",
|
||||
"sizeBeta": "45 MB",
|
||||
"urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases",
|
||||
"MessageBeta": "<h2>3.8.4</h2>Bugs fixed.",
|
||||
"MessageBeta": "<h2>3.8.5</h2>Bugs fixed.",
|
||||
"cancellableBeta": true
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue