From 82301f1776ef8ab68229c8ad5199d6aedcc3b96b Mon Sep 17 00:00:00 2001 From: fufesou Date: Sun, 1 Nov 2026 13:39:54 +0800 Subject: [PATCH] Fix/windows install directory confirmation (#16783) * fix(windows): warn before removing installation directory Signed-off-by: fufesou * fix(windows): show inline installation directory warning Signed-off-by: fufesou * refactor(windows): simplify installation directory warning Key the warning widget by its path and remove the optional widget test suite. Signed-off-by: fufesou * fix(windows): limit installation warnings to the selected directory Share install-directory-not-empty-tip between inline and confirmation warnings, and remove the separate previous-installation warning. Signed-off-by: fufesou * fix(windows): skip directory warnings when reinstalling in place Signed-off-by: fufesou --------- Signed-off-by: fufesou --- flutter/lib/desktop/pages/install_page.dart | 72 ++++++++++---- .../install_directory_confirmation.dart | 96 +++++++++++++++++++ src/lang/ar.rs | 1 + src/lang/az.rs | 1 + src/lang/be.rs | 1 + src/lang/bg.rs | 1 + src/lang/ca.rs | 1 + src/lang/cn.rs | 1 + src/lang/cs.rs | 1 + src/lang/da.rs | 1 + src/lang/de.rs | 1 + src/lang/el.rs | 1 + src/lang/en.rs | 1 + src/lang/eo.rs | 1 + src/lang/es.rs | 1 + src/lang/et.rs | 1 + src/lang/eu.rs | 1 + src/lang/fa.rs | 1 + src/lang/fi.rs | 1 + src/lang/fr.rs | 1 + src/lang/ge.rs | 1 + src/lang/gl.rs | 1 + src/lang/gu.rs | 1 + src/lang/he.rs | 1 + src/lang/hi.rs | 1 + src/lang/hr.rs | 1 + src/lang/hu.rs | 1 + src/lang/id.rs | 1 + src/lang/it.rs | 1 + src/lang/ja.rs | 1 + src/lang/ko.rs | 1 + src/lang/kz.rs | 1 + src/lang/lt.rs | 1 + src/lang/lv.rs | 1 + src/lang/ml.rs | 1 + src/lang/nb.rs | 1 + src/lang/nl.rs | 1 + src/lang/pl.rs | 1 + src/lang/pt_BR.rs | 1 + src/lang/pt_PT.rs | 1 + src/lang/ro.rs | 1 + src/lang/ru.rs | 1 + src/lang/sc.rs | 1 + src/lang/sk.rs | 1 + src/lang/sl.rs | 1 + src/lang/sq.rs | 1 + src/lang/sr.rs | 1 + src/lang/sv.rs | 1 + src/lang/ta.rs | 1 + src/lang/template.rs | 1 + src/lang/th.rs | 1 + src/lang/tr.rs | 1 + src/lang/tw.rs | 1 + src/lang/uk.rs | 1 + src/lang/ur.rs | 1 + src/lang/vi.rs | 1 + 56 files changed, 201 insertions(+), 21 deletions(-) create mode 100644 flutter/lib/desktop/widgets/install_directory_confirmation.dart diff --git a/flutter/lib/desktop/pages/install_page.dart b/flutter/lib/desktop/pages/install_page.dart index 8e72f8d31..58ff028f2 100644 --- a/flutter/lib/desktop/pages/install_page.dart +++ b/flutter/lib/desktop/pages/install_page.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/common.dart'; +import 'package:flutter_hbb/desktop/widgets/install_directory_confirmation.dart'; import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:flutter_hbb/models/state_model.dart'; @@ -164,27 +165,46 @@ class _InstallPageBodyState extends State<_InstallPageBody> children: [ Text(translate('Installation'), style: Theme.of(context).textTheme.headlineMedium), - Row( + Table( + columnWidths: const { + 0: IntrinsicColumnWidth(), + 2: IntrinsicColumnWidth(), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, children: [ - Text('${translate('Installation Path')}:') - .marginOnly(right: 10), - Expanded( - child: TextField( - controller: controller, - readOnly: true, - decoration: InputDecoration( - contentPadding: EdgeInsets.all(0.75 * em), + TableRow( + children: [ + Text('${translate('Installation Path')}:') + .marginOnly(right: 10), + TextField( + controller: controller, + readOnly: true, + decoration: InputDecoration( + contentPadding: EdgeInsets.all(0.75 * em), + ), + ).workaroundFreezeLinuxMint().marginOnly(right: 10), + Obx( + () => OutlinedButton.icon( + icon: Icon(Icons.folder_outlined, size: 16), + onPressed: + btnEnabled.value ? selectInstallPath : null, + style: buttonStyle, + label: Text(translate('Change Path')), + ), ), - ).workaroundFreezeLinuxMint().marginOnly(right: 10), + ], + ), + TableRow( + children: [ + const SizedBox.shrink(), + ValueListenableBuilder( + valueListenable: controller, + builder: (context, value, child) => + InstallDirectoryWarning(directoryPath: value.text), + ).marginOnly(right: 10), + const SizedBox.shrink(), + ], ), - Obx( - () => OutlinedButton.icon( - icon: Icon(Icons.folder_outlined, size: 16), - onPressed: btnEnabled.value ? selectInstallPath : null, - style: buttonStyle, - label: Text(translate('Change Path')), - ), - ) ], ).marginSymmetric(vertical: 2 * em), Option(startmenu, label: 'Create start menu shortcuts') @@ -277,7 +297,9 @@ class _InstallPageBodyState extends State<_InstallPageBody> )); } - void install() { + Future install() async { + if (!btnEnabled.value) return; + final installPath = controller.text; do_install() { btnEnabled.value = false; cancelEnabled.value = false; @@ -286,10 +308,18 @@ class _InstallPageBodyState extends State<_InstallPageBody> if (startmenu.value) args += ' startmenu'; if (desktopicon.value) args += ' desktopicon'; if (printer.value) args += ' printer'; - bind.installInstallMe(options: args, path: controller.text); + bind.installInstallMe(options: args, path: installPath); } - do_install(); + btnEnabled.value = false; + try { + final confirmed = + await confirmInstallDirectory(this.context, targetPath: installPath); + if (!mounted || !confirmed) return; + do_install(); + } finally { + if (mounted && !showProgress.value) btnEnabled.value = true; + } } void selectInstallPath() async { diff --git a/flutter/lib/desktop/widgets/install_directory_confirmation.dart b/flutter/lib/desktop/widgets/install_directory_confirmation.dart new file mode 100644 index 000000000..d48b203a9 --- /dev/null +++ b/flutter/lib/desktop/widgets/install_directory_confirmation.dart @@ -0,0 +1,96 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common.dart'; +import 'package:flutter_hbb/models/platform_model.dart'; +import 'package:path/path.dart' as path; + +const _nonemptyDirectoryWarning = 'install-directory-not-empty-tip'; + +Future confirmInstallDirectory(BuildContext context, + {required String targetPath}) async { + try { + final needsWarning = await _needsDirectoryWarning(targetPath); + if (!context.mounted) return false; + if (!needsWarning) return true; + return await _showDirectoryDialog( + context, '${translate(_nonemptyDirectoryWarning)}\n$targetPath'); + } on FileSystemException catch (error) { + debugPrint('Failed to inspect installation directory: $error'); + if (context.mounted) { + await _showDirectoryDialog(context, error.toString(), isError: true); + } + return false; + } +} + +Future _needsDirectoryWarning(String directoryPath) async { + if (bind.mainIsInstalled() && + path.equals(directoryPath, bind.installInstallPath())) { + return false; + } + final directory = Directory(directoryPath); + return await directory.exists() && + !await directory.list(followLinks: false).isEmpty; +} + +Future _showDirectoryDialog(BuildContext context, String message, + {bool isError = false}) async { + final confirmed = await showDialog( + context: context, + builder: (dialogContext) => AlertDialog( + scrollable: true, + title: Text(translate(isError ? 'Error' : 'Warning')), + content: SelectableText(message), + actions: [ + dialogButton(isError ? 'OK' : 'Cancel', + isOutline: !isError, + onPressed: () => Navigator.of(dialogContext).pop(false)), + if (!isError) + dialogButton('Continue', + onPressed: () => Navigator.of(dialogContext).pop(true)), + ], + ), + ); + return confirmed == true; +} + +class InstallDirectoryWarning extends StatefulWidget { + InstallDirectoryWarning({required this.directoryPath}) + : super(key: ValueKey(directoryPath)); + + final String directoryPath; + + @override + State createState() => + _InstallDirectoryWarningState(); +} + +class _InstallDirectoryWarningState extends State { + static const _spacing = 8.0; + late final Future _needsWarning = + _needsDirectoryWarning(widget.directoryPath); + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _needsWarning, + builder: (context, snapshot) { + if (!snapshot.hasError && snapshot.data != true) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric(vertical: _spacing), + child: Text( + snapshot.hasError + ? '${translate('Error')}: ${snapshot.error}' + : translate(_nonemptyDirectoryWarning), + style: TextStyle( + color: snapshot.hasError + ? Theme.of(context).colorScheme.error + : Colors.orange.shade700)), + ); + }, + ); + } +} diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 1ebc7c757..873b5fed5 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "الرجاء اختيار Android → media."), ("Trust duration (days)", "مدة الثقة (بالأيام)"), ("Renew trust", "تجديد الثقة"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/az.rs b/src/lang/az.rs index 714f4110f..eff045444 100644 --- a/src/lang/az.rs +++ b/src/lang/az.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Zəhmət olmasa, Android → media seçin."), ("Trust duration (days)", "Etibar müddəti (gün)"), ("Renew trust", "Etibarı yenilə"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/be.rs b/src/lang/be.rs index cadc4e797..f3b5244ef 100644 --- a/src/lang/be.rs +++ b/src/lang/be.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Выберыце Android → media."), ("Trust duration (days)", "Тэрмін даверу (у днях)"), ("Renew trust", "Падоўжыць давер"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/bg.rs b/src/lang/bg.rs index c8ed6cf42..4b9be09da 100644 --- a/src/lang/bg.rs +++ b/src/lang/bg.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Моля, изберете Android → media."), ("Trust duration (days)", "Срок на доверие (дни)"), ("Renew trust", "Подновяване на доверието"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index d8b7dfc14..08a9610c9 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Seleccioneu Android → media."), ("Trust duration (days)", "Durada de la confiança (dies)"), ("Renew trust", "Renova la confiança"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 98e97631f..9f48c718e 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "请选择 Android → media。"), ("Trust duration (days)", "信任有效期(天)"), ("Renew trust", "延长信任有效期"), + ("install-directory-not-empty-tip", "所选文件夹不为空。安装可能删除现有数据。建议选择其他文件夹。"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 721051999..03f2a02ed 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Vyberte prosím Android → media."), ("Trust duration (days)", "Doba důvěry (dny)"), ("Renew trust", "Obnovit důvěru"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index e3ed60033..79c1f8bbe 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Vælg Android → media."), ("Trust duration (days)", "Tillidsperiode (dage)"), ("Renew trust", "Forny tillid"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index a03e3a260..88337466d 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Bitte wählen Sie Android → media."), ("Trust duration (days)", "Vertrauensdauer (Tage)"), ("Renew trust", "Vertrauen erneuern"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 1a5799e83..ab0ac36cf 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Παρακαλώ επιλέξτε Android → media."), ("Trust duration (days)", "Διάρκεια εμπιστοσύνης (ημέρες)"), ("Renew trust", "Ανανέωση εμπιστοσύνης"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index f3c654f0f..72b666174 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -291,5 +291,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("api_server_connection_tip", "Your custom server uses unencrypted HTTP. Contact your administrator to enable HTTPS."), ("api_server_empty_tip", "With API Server empty, your custom server defaults to HTTP. Contact your administrator to enable HTTPS."), ("android-logs-folder-tip", "Choose Android → media to store log files."), + ("install-directory-not-empty-tip", "The selected folder is not empty. Installation may delete existing data. Consider choosing a different folder."), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index fccb8616f..88a4a2a70 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Bonvolu elekti Android → media."), ("Trust duration (days)", "Daŭro de fido (tagoj)"), ("Renew trust", "Renovigi fidon"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index ff9127d1b..9adb6d7cd 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Seleccione Android → media."), ("Trust duration (days)", "Duración de la confianza (días)"), ("Renew trust", "Renovar confianza"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/et.rs b/src/lang/et.rs index a7d8980ef..1e33b966e 100644 --- a/src/lang/et.rs +++ b/src/lang/et.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Palun vali Android → media."), ("Trust duration (days)", "Usalduse kestus (päevades)"), ("Renew trust", "Uuenda usaldust"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eu.rs b/src/lang/eu.rs index dc00c810a..9f6ebb72c 100644 --- a/src/lang/eu.rs +++ b/src/lang/eu.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Hautatu Android → media."), ("Trust duration (days)", "Konfiantzaren iraupena (egunak)"), ("Renew trust", "Berritu konfiantza"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 66d5dc79c..ec7ae95a0 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "لطفاً Android → media را انتخاب کنید."), ("Trust duration (days)", "مدت اعتماد (روز)"), ("Renew trust", "تمدید اعتماد"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fi.rs b/src/lang/fi.rs index d4277de0f..c50c24729 100644 --- a/src/lang/fi.rs +++ b/src/lang/fi.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Valitse Android → media."), ("Trust duration (days)", "Luottamuksen kesto (päivää)"), ("Renew trust", "Jatka luottamusta"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 72376b909..d68932b42 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Veuillez sélectionner Android → media."), ("Trust duration (days)", "Durée de confiance (jours)"), ("Renew trust", "Renouveler la confiance"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ge.rs b/src/lang/ge.rs index fe76e3551..bdf7cd0e3 100644 --- a/src/lang/ge.rs +++ b/src/lang/ge.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "გთხოვთ, აირჩიოთ Android → media."), ("Trust duration (days)", "ნდობის ხანგრძლივობა (დღე)"), ("Renew trust", "ნდობის განახლება"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/gl.rs b/src/lang/gl.rs index 1cade2857..b6d6270fe 100644 --- a/src/lang/gl.rs +++ b/src/lang/gl.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Selecciona Android → media."), ("Trust duration (days)", "Duración da confianza (días)"), ("Renew trust", "Renovar a confianza"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/gu.rs b/src/lang/gu.rs index c73cdb5b5..51c952fe0 100644 --- a/src/lang/gu.rs +++ b/src/lang/gu.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "કૃપા કરીને Android → media પસંદ કરો."), ("Trust duration (days)", "વિશ્વાસ અવધિ (દિવસો)"), ("Renew trust", "વિશ્વાસ નવીકરણ કરો"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/he.rs b/src/lang/he.rs index 102a129bc..cc4c23a09 100644 --- a/src/lang/he.rs +++ b/src/lang/he.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "אנא בחר Android → media."), ("Trust duration (days)", "משך האמון (ימים)"), ("Renew trust", "חידוש אמון"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hi.rs b/src/lang/hi.rs index ce5dc2140..016b77405 100644 --- a/src/lang/hi.rs +++ b/src/lang/hi.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "कृपया Android → media चुनें।"), ("Trust duration (days)", "विश्वास अवधि (दिन)"), ("Renew trust", "विश्वास नवीनीकृत करें"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hr.rs b/src/lang/hr.rs index bef672007..9c3ca651d 100644 --- a/src/lang/hr.rs +++ b/src/lang/hr.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Odaberite Android → media."), ("Trust duration (days)", "Trajanje povjerenja (dani)"), ("Renew trust", "Obnovi povjerenje"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 145914e3c..d83fdc0e3 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Válassza az Android → media mappát."), ("Trust duration (days)", "Megbízhatóság időtartama (nap)"), ("Renew trust", "Megbízhatóság megújítása"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 364d542fc..b45dd0d6b 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Silakan pilih Android → media."), ("Trust duration (days)", "Durasi kepercayaan (hari)"), ("Renew trust", "Perbarui kepercayaan"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index 42d74e8a8..8b9bdc2d2 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Seleziona Android → media."), ("Trust duration (days)", "Durata attendibilità (giorni)"), ("Renew trust", "Rinnova attendibilità"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 3239326c0..1d8543b49 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Android → media を選択してください。"), ("Trust duration (days)", "信頼期間 (日)"), ("Renew trust", "信頼を更新"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 490e780e1..c4414949e 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Android → media를 선택해 주시기 바랍니다."), ("Trust duration (days)", "신뢰 유지 기간 (일)"), ("Renew trust", "신뢰 갱신"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 9dbdf611f..c5d9a340a 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Android → media таңдаңыз."), ("Trust duration (days)", "Сенім мерзімі (күн)"), ("Renew trust", "Сенімді жаңарту"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index bd4f1ce6c..f9351ef34 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Pasirinkite Android → media."), ("Trust duration (days)", "Pasitikėjimo trukmė (dienomis)"), ("Renew trust", "Atnaujinti pasitikėjimą"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index f00b2fe4a..93e117182 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Lūdzu, atlasiet Android → media."), ("Trust duration (days)", "Uzticēšanās ilgums (dienas)"), ("Renew trust", "Atjaunot uzticēšanos"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ml.rs b/src/lang/ml.rs index e5be24a38..dcdd60503 100644 --- a/src/lang/ml.rs +++ b/src/lang/ml.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "ദയവായി Android → media തിരഞ്ഞെടുക്കുക."), ("Trust duration (days)", "വിശ്വാസ കാലാവധി (ദിവസം)"), ("Renew trust", "വിശ്വാസം പുതുക്കുക"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nb.rs b/src/lang/nb.rs index 33ef45e7e..3a20c57ab 100644 --- a/src/lang/nb.rs +++ b/src/lang/nb.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Velg Android → media."), ("Trust duration (days)", "Klareringsperiode (dager)"), ("Renew trust", "Forny klarering"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index e5dad3719..2c9a5484c 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Selecteer Android → media."), ("Trust duration (days)", "Vertrouwensperiode (dagen)"), ("Renew trust", "Vertrouwen hernieuwen"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index 192c36604..d70da06de 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Wybierz Android → media."), ("Trust duration (days)", "Okres zaufania (dni)"), ("Renew trust", "Odnów zaufanie"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_BR.rs b/src/lang/pt_BR.rs index 21c636a5b..7fbae4ce8 100644 --- a/src/lang/pt_BR.rs +++ b/src/lang/pt_BR.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Selecione Android → media."), ("Trust duration (days)", "Duração da confiança (dias)"), ("Renew trust", "Renovar confiança"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 1adcb6e7e..1a60f8ae7 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Por favor selecione Android → media."), ("Trust duration (days)", "Duração da confiança (dias)"), ("Renew trust", "Renovar confiança"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 05cce6ab8..56918f750 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Selectează Android → media."), ("Trust duration (days)", "Durata încrederii (zile)"), ("Renew trust", "Reînnoiește încrederea"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index dc7757219..3b5fed87d 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Выберите Android → media."), ("Trust duration (days)", "Срок доверия (в днях)"), ("Renew trust", "Продлить доверие"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sc.rs b/src/lang/sc.rs index f17608d4d..166f9c262 100644 --- a/src/lang/sc.rs +++ b/src/lang/sc.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Seletziona Android → media."), ("Trust duration (days)", "Durada de sa fidùtzia (dies)"), ("Renew trust", "Annoa sa fidùtzia"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 7d5faf167..75113960d 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Vyberte Android → media."), ("Trust duration (days)", "Doba dôvery (dni)"), ("Renew trust", "Obnoviť dôveru"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 1107246c7..a15c02f8e 100644 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Izberite Android → media."), ("Trust duration (days)", "Trajanje zaupanja (dni)"), ("Renew trust", "Obnovi zaupanje"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 3d329af4c..69669749b 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Ju lutemi zgjidhni Android → media."), ("Trust duration (days)", "Kohëzgjatja e besimit (ditë)"), ("Renew trust", "Rinovo besimin"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index def1efeb8..6e1d73783 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Izaberite Android → media."), ("Trust duration (days)", "Trajanje poverenja (dani)"), ("Renew trust", "Obnovi poverenje"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 5aad93760..49c7e328b 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Välj Android → media."), ("Trust duration (days)", "Förtroendeperiod (dagar)"), ("Renew trust", "Förnya förtroende"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ta.rs b/src/lang/ta.rs index 51ba9f8bc..de48cc36e 100644 --- a/src/lang/ta.rs +++ b/src/lang/ta.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Android → media என்பதைத் தேர்ந்தெடுக்கவும்."), ("Trust duration (days)", "நம்பிக்கைக் காலம் (நாட்கள்)"), ("Renew trust", "நம்பிக்கையைப் புதுப்பி"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 0ca3c660b..567d694a8 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", ""), ("Trust duration (days)", ""), ("Renew trust", ""), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index 14deca923..736f33bd5 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "กรุณาเลือก Android → media"), ("Trust duration (days)", "ระยะเวลาการเชื่อถือ (วัน)"), ("Renew trust", "ต่ออายุการเชื่อถือ"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 44dd56e7e..b90e4ad0a 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Lütfen Android → media konumunu seçin."), ("Trust duration (days)", "Güven süresi (gün)"), ("Renew trust", "Güveni yenile"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 793e8d0b1..a0f923dd4 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "請選擇 Android → media。"), ("Trust duration (days)", "信任有效期(天)"), ("Renew trust", "延長信任期限"), + ("install-directory-not-empty-tip", "所選資料夾不是空的。安裝可能刪除現有資料。建議選擇其他資料夾。"), ].iter().cloned().collect(); } diff --git a/src/lang/uk.rs b/src/lang/uk.rs index 5a3a3f7fc..b86cfb7bd 100644 --- a/src/lang/uk.rs +++ b/src/lang/uk.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Будь ласка, виберіть Android → media."), ("Trust duration (days)", "Термін довіри (у днях)"), ("Renew trust", "Подовжити довіру"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ur.rs b/src/lang/ur.rs index ad2f10513..0cfaf2543 100644 --- a/src/lang/ur.rs +++ b/src/lang/ur.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "براہ کرم Android → media منتخب کریں۔"), ("Trust duration (days)", "اعتماد کی مدت (دن)"), ("Renew trust", "اعتماد کی تجدید کریں"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vi.rs b/src/lang/vi.rs index a51fd0473..af8e4464e 100644 --- a/src/lang/vi.rs +++ b/src/lang/vi.rs @@ -823,5 +823,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Please select Android → media.", "Vui lòng chọn Android → media."), ("Trust duration (days)", "Thời hạn tin cậy (ngày)"), ("Renew trust", "Gia hạn tin cậy"), + ("install-directory-not-empty-tip", ""), ].iter().cloned().collect(); }