From cc75ffbeeb52ae8871e68e0883d9f15affc847fb Mon Sep 17 00:00:00 2001 From: csf Date: Wed, 23 Mar 2022 15:28:21 +0800 Subject: [PATCH] add android translate --- lib/models/file_model.dart | 36 ++++++++++----------- lib/models/server_model.dart | 54 ++++++++++++++++++-------------- lib/pages/chat_page.dart | 5 +-- lib/pages/file_manager_page.dart | 44 +++++++++++++------------- lib/pages/server_page.dart | 23 +++++--------- lib/pages/settings_page.dart | 2 +- 6 files changed, 82 insertions(+), 82 deletions(-) diff --git a/lib/models/file_model.dart b/lib/models/file_model.dart index 136d97b8f..73ec57afe 100644 --- a/lib/models/file_model.dart +++ b/lib/models/file_model.dart @@ -9,7 +9,7 @@ import 'package:path/path.dart' as Path; import 'model.dart'; -enum SortBy { name, type, date, size } +enum SortBy { Name, Type, Modified, Size } // enum FileType { // Dir = 0, @@ -42,7 +42,7 @@ class FileModel extends ChangeNotifier { JobState get jobState => _jobProgress.state; - SortBy _sortStyle = SortBy.name; + SortBy _sortStyle = SortBy.Name; SortBy get sortStyle => _sortStyle; @@ -272,19 +272,19 @@ class FileModel extends ChangeNotifier { var content = ""; late final List entries; if (item.isFile) { - title = "是否永久删除文件"; + title = translate("Are you sure you want to delete this file?"); content = "${item.name}"; entries = [item]; } else if (item.isDirectory) { - title = "这不是一个空文件夹"; - showLoading("正在读取..."); + title = translate("Not a Empty Directory"); + showLoading(translate("Waiting")); final fd = await _fileFetcher.fetchDirectoryRecursive( _jobId, item.path, items.isLocal!, true); fd.format(isWindows); EasyLoading.dismiss(); // 空文件夹 if (fd.entries.isEmpty) { - final confirm = await showRemoveDialog("是否删除空文件夹", item.name, false); + final confirm = await showRemoveDialog(translate("Are you sure you want to delete this empty directory?"), item.name, false); if (confirm == true) { sendRemoveEmptyDir(item.path, 0, items.isLocal!); } @@ -296,9 +296,9 @@ class FileModel extends ChangeNotifier { } for (var i = 0; i < entries.length; i++) { - final dirShow = item.isDirectory ? "是否删除文件夹下的文件?\n" : ""; + final dirShow = item.isDirectory ? "${translate("Are you sure you want to delete the file of this directory?")}\n" : ""; final count = - entries.length > 1 ? "第 ${i + 1}/${entries.length} 项" : ""; + entries.length > 1 ? "${i + 1}/${entries.length}" : ""; content = dirShow + "$count \n${entries[i].path}"; final confirm = await showRemoveDialog(title, content, item.isDirectory); @@ -348,7 +348,7 @@ class FileModel extends ChangeNotifier { children: [ Text(content), SizedBox(height: 5), - Text("此操作不可逆!", + Text(translate("This is irreversible!"), style: TextStyle(fontWeight: FontWeight.bold)), showCheckbox ? CheckboxListTile( @@ -356,7 +356,7 @@ class FileModel extends ChangeNotifier { dense: true, controlAffinity: ListTileControlAffinity.leading, title: Text( - "应用于文件夹下所有文件", + translate("Do this for all conflicts"), ), value: removeCheckboxRemember, onChanged: (v) { @@ -369,12 +369,12 @@ class FileModel extends ChangeNotifier { actions: [ TextButton( style: flatButtonStyle, - onPressed: () => close(true), - child: Text("Yes")), + onPressed: () => close(false), + child: Text(translate("Cancel"))), TextButton( style: flatButtonStyle, - onPressed: () => close(false), - child: Text("No")) + onPressed: () => close(true), + child: Text(translate("OK"))), ])); } @@ -675,7 +675,7 @@ class DirectoryOption { // code from file_manager pkg after edit List _sortList(List list, SortBy sortType) { - if (sortType == SortBy.name) { + if (sortType == SortBy.Name) { // making list of only folders. final dirs = list.where((element) => element.isDirectory).toList(); // sorting folder list by name. @@ -688,7 +688,7 @@ List _sortList(List list, SortBy sortType) { // first folders will go to list (if available) then files will go to list. return [...dirs, ...files]; - } else if (sortType == SortBy.date) { + } else if (sortType == SortBy.Modified) { // making the list of Path & DateTime List<_PathStat> _pathStat = []; for (Entry e in list) { @@ -703,7 +703,7 @@ List _sortList(List list, SortBy sortType) { .indexWhere((element) => element.path == a.name) .compareTo(_pathStat.indexWhere((element) => element.path == b.name))); return list; - } else if (sortType == SortBy.type) { + } else if (sortType == SortBy.Type) { // making list of only folders. final dirs = list.where((element) => element.isDirectory).toList(); @@ -720,7 +720,7 @@ List _sortList(List list, SortBy sortType) { .last .compareTo(b.name.toLowerCase().split('.').last)); return [...dirs, ...files]; - } else if (sortType == SortBy.size) { + } else if (sortType == SortBy.Size) { // create list of path and size Map _sizeMap = {}; for (Entry e in list) { diff --git a/lib/models/server_model.dart b/lib/models/server_model.dart index cb46ab3d6..36e976ae8 100644 --- a/lib/models/server_model.dart +++ b/lib/models/server_model.dart @@ -80,11 +80,11 @@ class ServerModel with ChangeNotifier { toggleService() async { if(_isStart){ final res = await DialogManager.show((setState, close) => CustomAlertDialog( - title: Text("是否关闭"), - content: Text("关闭录屏服务将自动关闭所有已连接的控制"), + title: Text(translate("Warning")), + content: Text(translate("android_stop_service_tip")), actions: [ - TextButton(onPressed: ()=>close(), child: Text("Cancel")), - ElevatedButton(onPressed: ()=>close(true), child: Text("Ok")), + TextButton(onPressed: ()=>close(), child: Text(translate("Cancel"))), + ElevatedButton(onPressed: ()=>close(true), child: Text(translate("OK"))), ], )); if(res == true){ @@ -92,11 +92,11 @@ class ServerModel with ChangeNotifier { } }else{ final res = await DialogManager.show((setState, close) => CustomAlertDialog( - title: Text("是否开启录屏服务"), - content: Text("将自动开启监听服务"), + title: Text(translate("Warning")), + content: Text(translate("android_service_will_start_tip")), actions: [ - TextButton(onPressed: ()=>close(), child: Text("Cancel")), - ElevatedButton(onPressed: ()=>close(true), child: Text("Ok")), + TextButton(onPressed: ()=>close(), child: Text(translate("Cancel"))), + ElevatedButton(onPressed: ()=>close(true), child: Text(translate("OK"))), ], )); if(res == true){ @@ -169,7 +169,6 @@ class ServerModel with ChangeNotifier { switch (name) { case "media": _mediaOk = value; - debugPrint("value $value,_isStart:$_isStart"); if(value && !_isStart){ startService(); } @@ -191,13 +190,11 @@ class ServerModel with ChangeNotifier { updateClientState() { var res = FFI.getByName("clients_state"); - debugPrint("getByName clients_state string:$res"); try { final List clientsJson = jsonDecode(res); _clients = clientsJson .map((clientJson) => Client.fromJson(jsonDecode(res))) .toList(); - debugPrint("updateClientState:${_clients.toString()}"); notifyListeners(); } catch (e) {} } @@ -217,7 +214,7 @@ class ServerModel with ChangeNotifier { Text(translate("Do you accept?")), SizedBox(height: 20), clientInfo(client), - Text(translate("It will be control your device!")), + Text(translate("android_new_connection_tip")), ], ), actions: [ @@ -321,27 +318,36 @@ showInputWarnAlert() async { await showDialog( context: globalKey.currentContext!, builder: (alertContext) { - // TODO t DialogManager.register(alertContext); return AlertDialog( title: Text("获取输入权限引导"), - content: Text.rich(TextSpan(style: TextStyle(), children: [ - TextSpan(text: "请在接下来的系统设置页\n进入"), - TextSpan(text: " [服务] ", style: TextStyle(color: MyTheme.accent)), - TextSpan(text: "配置页面\n将"), - TextSpan( - text: " [RustDesk Input] ", - style: TextStyle(color: MyTheme.accent)), - TextSpan(text: "服务开启") - ])), + // content: Text.rich(TextSpan(style: TextStyle(), children: [ + // // [已安装的服务] : [Installed Services] + // // 请在接下来的系统设置页面里,找到并进入[Installed Services]页面,将[RustDesk Input]服务开启。 + // TextSpan(text: "请在接下来的系统设置页\n进入"), + // TextSpan(text: " [服务] ", style: TextStyle(color: MyTheme.accent)), + // TextSpan(text: "配置页面\n将"), + // TextSpan( + // text: " [RustDesk Input] ", + // style: TextStyle(color: MyTheme.accent)), + // TextSpan(text: "服务开启") + // ])), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(translate(translate("android_input_permission_tip1"))), + SizedBox(height: 10), + Text(translate(translate("android_input_permission_tip2"))), + ], + ), actions: [ TextButton( - child: Text(translate("Do nothing")), + child: Text(translate("Cancel")), onPressed: () { DialogManager.reset(); }), ElevatedButton( - child: Text(translate("Go System Setting")), + child: Text(translate("Open System Setting")), onPressed: () { FFI.serverModel.initInput(); DialogManager.reset(); diff --git a/lib/pages/chat_page.dart b/lib/pages/chat_page.dart index f06cdc315..5b5665adc 100644 --- a/lib/pages/chat_page.dart +++ b/lib/pages/chat_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/models/chat_model.dart'; import 'package:provider/provider.dart'; +import '../models/model.dart'; import 'home_page.dart'; OverlayEntry? iconOverlayEntry; @@ -13,7 +14,7 @@ ChatPage chatPage = ChatPage(); class ChatPage extends StatelessWidget implements PageShape { @override - final title = "Chat"; + final title = translate("Chat"); @override final icon = Icon(Icons.chat); @@ -209,7 +210,7 @@ class _ChatWindowOverlayState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding(padding: EdgeInsets.symmetric(horizontal: 15),child: Text( - "Chat", + translate("Chat"), style: TextStyle( color: Colors.white, fontFamily: 'WorkSans', diff --git a/lib/pages/file_manager_page.dart b/lib/pages/file_manager_page.dart index aeaa9543b..d17971d6d 100644 --- a/lib/pages/file_manager_page.dart +++ b/lib/pages/file_manager_page.dart @@ -139,12 +139,12 @@ class _FileManagerPageState extends State { itemBuilder: (context) { return [ PopupMenuItem( - child: Text("删除"), + child: Text(translate("Delete")), value: "delete", ), PopupMenuItem( - child: Text("详细信息"), - value: "delete", + child: Text(translate("Properties")), + value: "properties", enabled: false, ) ]; @@ -255,14 +255,13 @@ class _FileManagerPageState extends State { )), Row( children: [ - // IconButton(onPressed: () {}, icon: Icon(Icons.sort)), PopupMenuButton( icon: Icon(Icons.sort), itemBuilder: (context) { return SortBy.values .map((e) => PopupMenuItem( child: Text( - e.toString().split(".").last.toUpperCase()), + translate(e.toString().split(".").last)), value: e, )) .toList(); @@ -277,7 +276,7 @@ class _FileManagerPageState extends State { children: [ Icon(Icons.refresh), SizedBox(width: 5), - Text("刷新") + Text(translate("Refresh File")) ], ), value: "refresh", @@ -287,7 +286,7 @@ class _FileManagerPageState extends State { children: [ Icon(Icons.check), SizedBox(width: 5), - Text("多选") + Text(translate("CheckBox")) ], ), value: "select", @@ -309,7 +308,7 @@ class _FileManagerPageState extends State { ? Icons.check_box_outlined : Icons.check_box_outline_blank), SizedBox(width: 5), - Text(translate("Toggle Hidden")) + Text(translate("Show Hidden Files")) ], ), value: "hidden", @@ -340,6 +339,10 @@ class _FileManagerPageState extends State { ), actions: [ TextButton( + style: flatButtonStyle, + onPressed: () => close(false), + child: Text(translate("Cancel"))), + ElevatedButton( style: flatButtonStyle, onPressed: () { if (name.value.text.isNotEmpty) { @@ -350,11 +353,7 @@ class _FileManagerPageState extends State { close(); } }, - child: Text(translate("OK"))), - TextButton( - style: flatButtonStyle, - onPressed: () => close(false), - child: Text(translate("Cancel"))) + child: Text(translate("OK"))) ])); } else if (v == "hidden") { model.toggleShowHidden(); @@ -381,8 +380,9 @@ class _FileManagerPageState extends State { children: [ Padding( padding: EdgeInsets.all(2), + // TODO child: Text( - "总计: ${model.currentDir.entries.length}个项目", + "${translate("Count")}: ${model.currentDir.entries.length}${translate("items")}", style: TextStyle(color: MyTheme.darkGray), ), ) @@ -394,17 +394,17 @@ class _FileManagerPageState extends State { Widget? bottomSheet() { final state = model.jobState; final isOtherPage = _selectedItems.isOtherPage(model.isLocal); - final selectedItemsLength = "${_selectedItems.length} 个项目"; + final selectedItemsLength = "${_selectedItems.length} ${translate("items")}"; // TODO t final local = _selectedItems.isLocal == null ? "" - : " [${_selectedItems.isLocal! ? '本地' : '远程'}]"; + : " [${_selectedItems.isLocal! ? translate("Local") : translate("Remote")}]"; if (model.selectMode) { if (_selectedItems.length == 0 || !isOtherPage) { // 选择模式 当前选择页面 return BottomSheetBody( leading: Icon(Icons.check), - title: "已选择", + title: translate("Selected"), text: selectedItemsLength + local, onCanceled: () => model.toggleSelectMode(), actions: [ @@ -421,7 +421,7 @@ class _FileManagerPageState extends State { // 选择模式 复制目标页面 return BottomSheetBody( leading: Icon(Icons.input), - title: "粘贴到这里?", + title: translate("Paste here?"), text: selectedItemsLength + local, onCanceled: () => model.toggleSelectMode(), actions: [ @@ -440,21 +440,21 @@ class _FileManagerPageState extends State { case JobState.inProgress: return BottomSheetBody( leading: CircularProgressIndicator(), - title: "正在发送文件...", - text: "速度: ${readableFileSize(model.jobProgress.speed)}/s", + title: translate("Waiting"), + text: "${translate("Speed")}: ${readableFileSize(model.jobProgress.speed)}/s", onCanceled: null, ); case JobState.done: return BottomSheetBody( leading: Icon(Icons.check), - title: "操作成功!", + title: "${translate("Successful")}!", text: "", onCanceled: () => model.jobReset(), ); case JobState.error: return BottomSheetBody( leading: Icon(Icons.error), - title: "错误!", + title: "${translate("Error")}!", text: "", onCanceled: () => model.jobReset(), ); diff --git a/lib/pages/server_page.dart b/lib/pages/server_page.dart index ad5589ece..265939fcd 100644 --- a/lib/pages/server_page.dart +++ b/lib/pages/server_page.dart @@ -1,4 +1,3 @@ -import 'package:device_info/device_info.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/models/model.dart'; import 'package:provider/provider.dart'; @@ -11,7 +10,7 @@ import '../models/model.dart'; class ServerPage extends StatelessWidget implements PageShape { @override - final title = "Share Screen"; + final title = translate("Share Screen"); @override final icon = Icon(Icons.mobile_screen_share); @@ -27,7 +26,7 @@ class ServerPage extends StatelessWidget implements PageShape { enabled: false, ), PopupMenuItem( - child: Text("Set your own password"), + child: Text(translate("Set your own password")), value: "changePW", enabled: false, ) @@ -127,7 +126,7 @@ class _ServerInfoState extends State { color: Colors.redAccent, size: 24), SizedBox(width: 10), Text( - "屏幕共享尚未开启", + translate("Service is not running"), style: TextStyle( fontFamily: 'WorkSans', fontWeight: FontWeight.bold, @@ -140,7 +139,7 @@ class _ServerInfoState extends State { SizedBox(height: 5), Center( child: Text( - "点击[启动服务]或打开Screen Capture 开启共享手机屏幕", + translate("android_start_service_tip"), style: TextStyle(fontSize: 12, color: MyTheme.darkGray), )) ], @@ -170,19 +169,19 @@ class _PermissionCheckerState extends State { serverModel.toggleInput), PermissionRow(translate("File Transfer"), serverModel.fileOk, serverModel.toggleFile), - hasAudioPermission?PermissionRow(translate("Audio Capture"), serverModel.inputOk, - serverModel.toggleAudio):Text("* 当前安卓版本不支持音频捕获",style: TextStyle(color: MyTheme.darkGray),), + hasAudioPermission?PermissionRow(translate("Audio Capture"), serverModel.audioOk, + serverModel.toggleAudio):Text("* ${translate("android_version_audio_tip")}",style: TextStyle(color: MyTheme.darkGray),), SizedBox(height: 8), serverModel.mediaOk ? ElevatedButton.icon( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(Colors.red)), icon: Icon(Icons.stop), - onPressed: serverModel.stopService, + onPressed: serverModel.toggleService, label: Text(translate("Stop service"))) : ElevatedButton.icon( icon: Icon(Icons.play_arrow), - onPressed: serverModel.startService, + onPressed: serverModel.toggleService, label: Text(translate("Start Service"))), ], )); @@ -323,12 +322,6 @@ Widget clientInfo(Client client) { ]) ], ), - // !client.isFileTransfer?Row( - // children: [ - // client.audio?Icon(Icons.volume_up):SizedBox.shrink(), - // client.keyboard?Icon(Icons.mouse):SizedBox.shrink(), - // ], - // ):SizedBox.shrink() ]); } diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index 90692a2ca..4817610b5 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -7,7 +7,7 @@ import 'home_page.dart'; class SettingsPage extends StatelessWidget implements PageShape { @override - final title = "Settings"; + final title = translate("Settings"); @override final icon = Icon(Icons.settings);